/ Hex Artifact Content
Login

Artifact 1debf5ea6efd0f35335a2a615198a7a1017ffd4b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d40: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d50: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d70: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1db0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1dc0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dd0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1de0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1df0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e00: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e30: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e60: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e90: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ea0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1eb0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ec0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ed0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ef0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f00: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f10: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f20: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f30: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f50: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f70: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f80: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f90: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fa0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fb0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fc0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fd0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fe0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ff0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2000: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2010: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2020: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2030: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2040: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2050: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2060: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2070: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2080: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2090: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20a0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20c0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20d0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20f0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2100: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2130: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2140: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2150: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2160: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2170: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2180: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2190: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21a0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21b0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21c0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21e0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21f0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2200: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2210: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2220: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2230: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2240: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2250: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2260: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2270: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30  NIXFILE_EXCL   0
2280: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2290: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
22a0: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
22b0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63  ./*.** Include c
22c0: 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d  ode that is comm
22d0: 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63  on to all os_*.c
22e0: 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75   files.*/.#inclu
22f0: 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22  de "os_common.h"
2300: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
2310: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
2320: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
2330: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
2340: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
2350: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
2360: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
2370: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2380: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
2390: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
23a0: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
23b0: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
23c0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
23d0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
23e0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
23f0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
2400: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
2410: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
2420: 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64  /*.** The thread
2430: 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65  id macro resolve
2440: 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d  s to the thread-
2450: 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65  id or to 0.  Use
2460: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
2470: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
2480: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  nly..*/.#if SQLI
2490: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64  TE_THREADSAFE.#d
24a0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70  efine threadid p
24b0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65  thread_self().#e
24c0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65  lse.#define thre
24d0: 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  adid 0.#endif../
24e0: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
24f0: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2500: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2510: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2520: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2530: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2540: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2550: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2560: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2570: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2580: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2590: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
25a0: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
25b0: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
25c0: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
25d0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
25e0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
25f0: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2600: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2610: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 2f  r *zName;      /
2620: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
2630: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 76 6f  tem call */.  vo
2640: 69 64 20 2a 70 43 75 72 72 65 6e 74 3b 20 20 20  id *pCurrent;   
2650: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2660: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2670: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 76  stem call */.  v
2680: 6f 69 64 20 2a 70 44 65 66 61 75 6c 74 3b 20 20  oid *pDefault;  
2690: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
26a0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
26b0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
26c0: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
26d0: 28 76 6f 69 64 2a 29 6f 70 65 6e 2c 20 20 20 20  (void*)open,    
26e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
26f0: 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69   osOpen      ((i
2700: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
2710: 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63  *,int,int))aSysc
2720: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
2730: 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20  ..  { "close",  
2740: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 63 6c 6f        (void*)clo
2750: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
2760: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
2770: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
2780: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
2790: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
27a0: 65 73 73 22 2c 20 20 20 20 20 20 20 28 76 6f 69  ess",       (voi
27b0: 64 2a 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  d*)access,     0
27c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
27d0: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
27e0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
27f0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2800: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2810: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 76  etcwd",       (v
2820: 6f 69 64 2a 29 67 65 74 63 77 64 2c 20 20 20 20  oid*)getcwd,    
2830: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2840: 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68 61  sGetcwd    ((cha
2850: 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65  r*(*)(char*,size
2860: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  _t))aSyscall[3].
2870: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2880: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20 28  stat",         (
2890: 76 6f 69 64 2a 29 73 74 61 74 2c 20 20 20 20 20  void*)stat,     
28a0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
28b0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
28c0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
28d0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
28e0: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
28f0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
2900: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
2910: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
2920: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
2930: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
2940: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
2950: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
2960: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
2970: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
2980: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
2990: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
29a0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
29b0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
29c0: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
29d0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
29e0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
29f0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
2a00: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
2a10: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
2a20: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2a30: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2a40: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
2a50: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
2a60: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
2a70: 20 20 20 20 28 76 6f 69 64 2a 29 66 73 74 61 74      (void*)fstat
2a80: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
2a90: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
2aa0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
2ab0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
2ac0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2ad0: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
2ae0: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 76  truncate",    (v
2af0: 6f 69 64 2a 29 66 74 72 75 6e 63 61 74 65 2c 20  oid*)ftruncate, 
2b00: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2b10: 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74  sFtruncate ((int
2b20: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61  (*)(int,off_t))a
2b30: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
2b40: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c  ent)..  { "fcntl
2b50: 22 2c 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a  ",        (void*
2b60: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
2b70: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
2b80: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
2b90: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
2ba0: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
2bb0: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
2bc0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 72          (void*)r
2bd0: 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  ead,       0  },
2be0: 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20  .#define osRead 
2bf0: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
2c00: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
2c10: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  _t))aSyscall[8].
2c20: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2c30: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
2c40: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2c50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2c60: 4e 47 5f 53 54 59 4c 45 29 0a 20 20 7b 20 22 70  NG_STYLE).  { "p
2c70: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 76  read",        (v
2c80: 6f 69 64 2a 29 70 72 65 61 64 2c 20 20 20 20 20  oid*)pread,     
2c90: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
2ca0: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
2cb0: 20 28 76 6f 69 64 2a 29 30 2c 20 20 20 20 20 20   (void*)0,      
2cc0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
2cd0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
2ce0: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
2cf0: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
2d00: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
2d10: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
2d20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
2d30: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
2d40: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 76  read64",      (v
2d50: 6f 69 64 2a 29 70 72 65 61 64 36 34 2c 20 20 20  oid*)pread64,   
2d60: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
2d70: 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20   "pread64",     
2d80: 20 28 76 6f 69 64 2a 29 30 2c 20 20 20 20 20 20   (void*)0,      
2d90: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
2da0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
2db0: 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  64   ((ssize_t(*
2dc0: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
2dd0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
2de0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
2df0: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
2e00: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 77 72 69        (void*)wri
2e10: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
2e20: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
2e30: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
2e40: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
2e50: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2e60: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
2e70: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
2e80: 50 52 45 41 44 29 20 7c 7c 20 64 65 66 69 6e 65  PREAD) || define
2e90: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2ea0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20  LOCKING_STYLE). 
2eb0: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
2ec0: 20 20 20 28 76 6f 69 64 2a 29 70 77 72 69 74 65     (void*)pwrite
2ed0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
2ee0: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
2ef0: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20        (void*)0, 
2f00: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
2f10: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
2f20: 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69 7a  Pwrite    ((ssiz
2f30: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
2f40: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
2f50: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
2f60: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
2f70: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
2f80: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
2f90: 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20  SE_PREAD64).  { 
2fa0: 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20  "pwrite64",     
2fb0: 28 76 6f 69 64 2a 29 70 77 72 69 74 65 36 34 2c  (void*)pwrite64,
2fc0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
2fd0: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
2fe0: 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20 20 20     (void*)0,    
2ff0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3000: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3010: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3020: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3030: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3040: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3050: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3060: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3070: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
3080: 20 20 20 20 28 76 6f 69 64 2a 29 66 63 68 6d 6f      (void*)fchmo
3090: 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  d,     0  },.#de
30a0: 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20  fine osFchmod   
30b0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f   ((int(*)(int,mo
30c0: 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  de_t))aSyscall[1
30d0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
30e0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50  f defined(HAVE_P
30f0: 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20  OSIX_FALLOCATE) 
3100: 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  && HAVE_POSIX_FA
3110: 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c  LLOCATE.  { "fal
3120: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 76 6f 69  locate",    (voi
3130: 64 2a 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  d*)posix_falloca
3140: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3150: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3160: 20 20 20 20 28 76 6f 69 64 2a 29 30 2c 20 20 20      (void*)0,   
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3180: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3190: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
31b0: 6f 66 66 5f 74 29 61 53 79 73 63 61 6c 6c 5b 31  off_t)aSyscall[1
31c0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  5].pCurrent)..};
31d0: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
31e0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
31f0: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
3200: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
3210: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
3220: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
3230: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
3240: 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56   the.** "unix" V
3250: 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  FSes.  Return SQ
3260: 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63  LITE_OK opon suc
3270: 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69  cessfully updati
3280: 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d  ng the.** system
3290: 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f   call pointer, o
32a0: 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  r SQLITE_NOTFOUN
32b0: 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  D if there is no
32c0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a   configurable.**
32d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
32e0: 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ed zName..*/.sta
32f0: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53  tic int unixSetS
3300: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
3310: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
3320: 65 64 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 56  ed,     /* The V
3330: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
3340: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
3350: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
3360: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3370: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
3380: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 76 6f  override */.  vo
3390: 69 64 20 2a 70 4e 65 77 46 75 6e 63 20 20 20 20  id *pNewFunc    
33a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
33b0: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
33c0: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
33d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
33e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
33f0: 54 46 4f 55 4e 44 3b 0a 20 20 69 66 28 20 7a 4e  TFOUND;.  if( zN
3400: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
3410: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
3420: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3430: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3440: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3450: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3460: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
3480: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
3490: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
34a0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
34b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
34c0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
34d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
34e0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
34f0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
3500: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
3510: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
3520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
3540: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
3550: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
3560: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
3570: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
3580: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
3590: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
35a0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
35b0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
35c0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
35d0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
35e0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
35f0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
3600: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
3610: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
3620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3630: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3640: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
3650: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
3660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3670: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3680: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
3690: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
36a0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
36b0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
36c0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
36d0: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
36e0: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
36f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3720: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
3730: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
3740: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
3750: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
3760: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
3770: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
3780: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
3790: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
37a0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
37b0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
37c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37d0: 20 2a 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43   *unixGetSystemC
37e0: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
37f0: 2a 70 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74  *pNotUsed, const
3800: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
3810: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3820: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
3830: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
3840: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
3850: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
3860: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
3870: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
3880: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
3890: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
38a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
38b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
38c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
38d0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
38e0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
38f0: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
3900: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
3910: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
3920: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
3930: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
3940: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
3950: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
3960: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
3970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
3980: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
3990: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
39a0: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e  onst char *unixN
39b0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
39c0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
39d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
39e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
39f0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
3a00: 20 69 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65   i = -1;.  }else
3a10: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3a20: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3a30: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3a40: 6c 5b 30 5d 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  l[0])-1; i++){. 
3a50: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
3a60: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
3a70: 30 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  0].zName)==0 ) b
3a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3a90: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 73 69 7a    for(i++; i<siz
3aa0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3ab0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3ac0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3ad0: 20 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75   aSyscall[0].pCu
3ae0: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
3af0: 6e 20 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 7a 4e  n aSyscall[0].zN
3b00: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
3b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
3b20: 74 72 79 20 6f 70 65 6e 28 29 20 63 61 6c 6c 73  try open() calls
3b30: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
3b40: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
3b50: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
3b60: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
3b70: 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d 29 7b 0a   int f, int m){.
3b80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
3b90: 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  rc = osOpen(z,f,
3ba0: 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  m); }while( rc<0
3bb0: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
3bc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
3bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
3be0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
3bf0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
3c00: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
3c10: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
3c20: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
3c30: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
3c40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
3c50: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
3c60: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
3c70: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
3c80: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
3c90: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
3ca0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
3cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
3cc0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
3cd0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
3ce0: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
3cf0: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
3d00: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
3d10: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
3d20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
3d30: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
3d40: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
3d50: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
3d60: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
3d70: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
3d80: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
3d90: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
3da0: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
3db0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
3dc0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
3dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3de0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
3df0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
3e00: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
3e10: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
3e20: 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75  void unixLeaveMu
3e30: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
3e40: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
3e50: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
3e60: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
3e70: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
3e80: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
3e90: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
3ea0: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
3eb0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
3ec0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3ed0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
3ee0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
3ef0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
3f00: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
3f10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3f20: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
3f30: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
3f40: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
3f50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
3f60: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
3f70: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
3f80: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
3f90: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
3fa0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
3fb0: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
3fc0: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
3fd0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65  nst char *azFile
3fe0: 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f  Lock(int eFileLo
3ff0: 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  ck){.  switch( e
4000: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4010: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
4020: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20  turn "NONE";.   
4030: 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43   case SHARED_LOC
4040: 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45  K: return "SHARE
4050: 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  D";.    case RES
4060: 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  ERVED_LOCK: retu
4070: 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20  rn "RESERVED";. 
4080: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
4090: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
40a0: 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65  NDING";.    case
40b0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
40c0: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
40d0: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
40e0: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
40f0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4100: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a  TE_LOCK_TRACE./*
4110: 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e  .** Print out in
4120: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4130: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  all locking oper
4140: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
4150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4160: 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  ed for troublesh
4170: 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ooting locks on 
4180: 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a  multithreaded.**
4190: 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61   platforms.  Ena
41a0: 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ble by compiling
41b0: 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49   with the -DSQLI
41c0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a  TE_LOCK_TRACE.**
41d0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
41e0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70  tion on the comp
41f0: 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65  iler.  This code
4200: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20   is normally.** 
4210: 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73  turned off..*/.s
4220: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72  tatic int lockTr
4230: 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ace(int fd, int 
4240: 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  op, struct flock
4250: 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f   *p){.  char *zO
4260: 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20  pName, *zType;. 
4270: 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61   int s;.  int sa
4280: 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20  vedErrno;.  if( 
4290: 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20  op==F_GETLK ){. 
42a0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45     zOpName = "GE
42b0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TLK";.  }else if
42c0: 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b  ( op==F_SETLK ){
42d0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
42e0: 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  SETLK";.  }else{
42f0: 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c  .    s = osFcntl
4300: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20  (fd, op, p);.   
4310: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4320: 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f  ntf("fcntl unkno
4330: 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20  wn %d %d %d\n", 
4340: 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20  fd, op, s);.    
4350: 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20  return s;.  }.  
4360: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
4370: 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _RDLCK ){.    zT
4380: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
4390: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
43a0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
43b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52  .    zType = "WR
43c0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
43d0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( p->l_type==F_U
43e0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  NLCK ){.    zTyp
43f0: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d  e = "UNLCK";.  }
4400: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4410: 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ( 0 );.  }.  ass
4420: 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65  ert( p->l_whence
4430: 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20  ==SEEK_SET );.  
4440: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
4450: 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45  op, p);.  savedE
4460: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
4470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4480: 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20  tf("fcntl %d %d 
4490: 25 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25  %s %s %d %d %d %
44a0: 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61  d\n",.     threa
44b0: 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65  did, fd, zOpName
44c0: 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d  , zType, (int)p-
44d0: 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70  >l_start, (int)p
44e0: 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69  ->l_len,.     (i
44f0: 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b  nt)p->l_pid, s);
4500: 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26  .  if( s==(-1) &
4510: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
4520: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
4530: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
4540: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
4550: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
4560: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
4570: 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c  .    osFcntl(fd,
4580: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a   F_GETLK, &l2);.
4590: 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70      if( l2.l_typ
45a0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
45b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c      zType = "RDL
45c0: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  CK";.    }else i
45d0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
45e0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  WRLCK ){.      z
45f0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
4600: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4610: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  .l_type==F_UNLCK
4620: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4630: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "UNLCK";.    }
4640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4650: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20  rt( 0 );.    }. 
4660: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4670: 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69  rintf("fcntl-fai
4680: 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20  lure-reason: %s 
4690: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
46a0: 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29      zType, (int)
46b0: 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  l2.l_start, (int
46c0: 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29  )l2.l_len, (int)
46d0: 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20  l2.l_pid);.  }. 
46e0: 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72   errno = savedEr
46f0: 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  rno;.  return s;
4700: 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74  .}.#undef osFcnt
4710: 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  l.#define osFcnt
4720: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
4730: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
4740: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
4750: 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74  * Retry ftruncat
4760: 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  e() calls that f
4770: 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52  ail due to EINTR
4780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4790: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
47a0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
47b0: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
47c0: 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  rc;.  do{ rc = o
47d0: 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29  sFtruncate(h,sz)
47e0: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
47f0: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
4800: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4810: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4820: 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20  tine translates 
4830: 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58  a standard POSIX
4840: 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f   errno code into
4850: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73   something.** us
4860: 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65  eful to the clie
4870: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
4880: 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53  e3 functions.  S
4890: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
48a0: 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74  is.** intended t
48b0: 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61  o translate a va
48c0: 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67  riety of "try ag
48d0: 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  ain" errors into
48e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20   SQLITE_BUSY.** 
48f0: 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66  and a variety of
4900: 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74   "please close t
4910: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
4920: 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69  or NOW" errors i
4930: 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  nto .** SQLITE_I
4940: 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f  OERR.** .** Erro
4950: 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  rs during initia
4960: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b  lization of lock
4970: 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65  s, or file syste
4980: 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f  m support for lo
4990: 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68  cks,.** should h
49a0: 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e  andle ENOLCK, EN
49b0: 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50  OTSUP, EOPNOTSUP
49c0: 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  P separately..*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
49e0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
49f0: 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45  Error(int posixE
4a00: 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65  rror, int sqlite
4a10: 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63  IOErr) {.  switc
4a20: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
4a30: 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20  .  case 0: .    
4a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4a50: 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41  ;.    .  case EA
4a60: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
4a70: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
4a80: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
4a90: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
4aa0: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
4ab0: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
4ac0: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
4ad0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
4ae0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
4af0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
4b00: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
4b10: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
4b20: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
4b30: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
4b40: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43      .  case EACC
4b50: 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43  ES: .    /* EACC
4b60: 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49  ES is like EAGAI
4b70: 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67  N during locking
4b80: 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74   operations, but
4b90: 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74   not any other t
4ba0: 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73  ime*/.    if( (s
4bb0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
4bc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
4bd0: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
4be0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
4bf0: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09  RR_UNLOCK) || ..
4c00: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
4c10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
4c20: 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65  OCK) ||..(sqlite
4c30: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
4c40: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
4c50: 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VEDLOCK) ){.    
4c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4c70: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
4c80: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72  /* else fall thr
4c90: 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45  ough */.  case E
4ca0: 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72  PERM: .    retur
4cb0: 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
4cc0: 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41 44     .  case EDEAD
4cd0: 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LK:.    return S
4ce0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
4cf0: 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f  KED;.    .#if EO
4d00: 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55  PNOTSUPP!=ENOTSU
4d10: 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53  P.  case EOPNOTS
4d20: 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d  UPP: .    /* som
4d30: 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72  ething went terr
4d40: 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73  ibly awry, unles
4d50: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
4d60: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20  stem support .  
4d70: 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69     * introspecti
4d80: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20  on, in which it 
4d90: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
4da0: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
4db0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f  endif.#ifdef ENO
4dc0: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54  TSUP.  case ENOT
4dd0: 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76  SUP: .    /* inv
4de0: 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20  alid fd, unless 
4df0: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
4e00: 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f  em support intro
4e10: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
4e20: 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63  ch .     * it ac
4e30: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
4e40: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
4e50: 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a  dif.  case EIO:.
4e60: 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20    case EBADF:.  
4e70: 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63  case EINVAL:.  c
4e80: 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20  ase ENOTCONN:.  
4e90: 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63  case ENODEV:.  c
4ea0: 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73  ase ENXIO:.  cas
4eb0: 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65  e ENOENT:.  case
4ec0: 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20   ESTALE:.  case 
4ed0: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
4ee0: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
4ef0: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
4f00: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
4f10: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
4f20: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
4f30: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4f40: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
4f50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fa0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
4fb0: 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75  **** Begin Uniqu
4fc0: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
4fd0: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
4fe0: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
4ff0: 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20  *.**.** On most 
5000: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
5010: 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75  , we can get a u
5020: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66  nique ID for a f
5030: 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ile by concatena
5040: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69  ting.** the devi
5050: 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ce number and th
5060: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
5070: 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e   But this does n
5080: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
5090: 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b  ks..** On VxWork
50a0: 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  s, a unique file
50b0: 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65   id must be base
50c0: 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  d on the canonic
50d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a  al filename..**.
50e0: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
50f0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5110: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73  ucture can be us
5120: 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75  ed as a.** uniqu
5130: 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57  e file ID in VxW
5140: 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74  orks.  Each inst
5150: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
5160: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
5170: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
5180: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5190: 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ame.  There is a
51a0: 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20  lso a reference 
51b0: 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20  count.  .** The 
51c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63  structure is rec
51d0: 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20  laimed when the 
51e0: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  number of pointe
51f0: 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74  rs to it drops t
5200: 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  o.** zero..**.**
5210: 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   There are never
5220: 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73   very many files
5230: 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d   open at one tim
5240: 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72  e and lookups ar
5250: 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f  e not.** a perfo
5260: 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20  rmance-critical 
5270: 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73  path, so it is s
5280: 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74  ufficient to put
5290: 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74   these.** struct
52a0: 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  ures on a linked
52b0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
52c0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b   vxworksFileId {
52d0: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
52e0: 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20  sFileId *pNext; 
52f0: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69   /* Next in a li
5300: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
5310: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5340: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
5350: 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  s one */.  int n
5360: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5380: 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e  th of the zCanon
5390: 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  icalName[] strin
53a0: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61  g */.  char *zCa
53b0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20  nonicalName;    
53c0: 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61       /* Canonica
53d0: 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  l filename */.};
53e0: 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
53f0: 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71  ./* .** All uniq
5400: 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ue filenames are
5410: 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65   held on a linke
5420: 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79  d list headed by
5430: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c   this.** variabl
5440: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e:.*/.static str
5450: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
5460: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  d *vxworksFileLi
5470: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
5480: 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61  implify a filena
5490: 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f  me into its cano
54a0: 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79  nical form.** by
54b0: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c   making the foll
54c0: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a  owing changes:.*
54d0: 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67  *.**  * removing
54e0: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e   any trailing an
54f0: 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a  d duplicate /.**
5500: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20    * convert /./ 
5510: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20  into just /.**  
5520: 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * convert /A/../
5530: 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20   where A is any 
5540: 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f  simple name into
5550: 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68   just /.**.** Ch
5560: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
5570: 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e  n-place.  Return
5580: 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65   the new name le
5590: 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ngth..**.** The 
55a0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
55b0: 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31  e is in z[0..n-1
55c0: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ].  Return the n
55d0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72  umber of.** char
55e0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69  acters in the si
55f0: 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a  mplified name..*
5600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77  /.static int vxw
5610: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
5620: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29  (char *z, int n)
5630: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
5640: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
5650: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
5660: 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ; }.  for(i=j=0;
5670: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
5680: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
5690: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
56a0: 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
56b0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  e;.      if( z[i
56c0: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c  +1]=='.' && i+2<
56d0: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27  n && z[i+2]=='/'
56e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
56f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
5700: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5710: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
5720: 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20  '.' && i+3<n && 
5730: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  z[i+2]=='.' && z
5740: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
5750: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
5760: 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20   && z[j-1]!='/' 
5770: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
5780: 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d    if( j>0 ){ j--
5790: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  ; }.        i +=
57a0: 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
57b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
57c0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
57d0: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
57e0: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
57f0: 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
5800: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49   a unique file I
5810: 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  D for the given 
5820: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d  absolute pathnam
5830: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  e.  Return.** a 
5840: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76  pointer to the v
5850: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5860: 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74  ect.  This point
5870: 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65  er is the unique
5880: 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a  .** file ID..**.
5890: 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c  ** The nRef fiel
58a0: 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73  d of the vxworks
58b0: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
58c0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66   incremented bef
58d0: 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ore.** the objec
58e0: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  t is returned.  
58f0: 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c  A new vxworksFil
5900: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72  eId object is cr
5910: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64  eated.** and add
5920: 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ed to the global
5930: 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61   list if necessa
5940: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ry..**.** If a m
5950: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5960: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
5970: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
5980: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
5990: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
59a0: 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f  rksFindFileId(co
59b0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c  nst char *zAbsol
59c0: 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75  uteName){.  stru
59d0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
59e0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
59f0: 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e  /* search key an
5a00: 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  d new file ID */
5a10: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
5a20: 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64  sFileId *pCandid
5a30: 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  ate;   /* For lo
5a40: 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74  oping over exist
5a50: 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a  ing file IDs */.
5a60: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
5a90: 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  of zAbsoluteName
5aa0: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73   string */..  as
5ab0: 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e  sert( zAbsoluteN
5ac0: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20  ame[0]=='/' );. 
5ad0: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
5ae0: 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b  (zAbsoluteName);
5af0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5b00: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
5b10: 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20  (*pNew) + (n+1) 
5b20: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
5b30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
5b40: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
5b50: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
5b60: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
5b70: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
5b80: 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e  Name, zAbsoluteN
5b90: 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d  ame, n+1);.  n =
5ba0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
5bb0: 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  Name(pNew->zCano
5bc0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a  nicalName, n);..
5bd0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
5be0: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
5bf0: 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20  y that matching 
5c00: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61  the canonical na
5c10: 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e  me..  ** If foun
5c20: 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
5c30: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5c40: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
5c50: 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  inter to.  ** th
5c60: 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  e existing file 
5c70: 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ID..  */.  unixE
5c80: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
5c90: 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78  or(pCandidate=vx
5ca0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70  worksFileList; p
5cb0: 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64  Candidate; pCand
5cc0: 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65  idate=pCandidate
5cd0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5ce0: 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e  ( pCandidate->nN
5cf0: 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20  ame==n .     && 
5d00: 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74  memcmp(pCandidat
5d10: 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  e->zCanonicalNam
5d20: 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  e, pNew->zCanoni
5d30: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20  calName, n)==0. 
5d40: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
5d50: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
5d60: 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61  .       pCandida
5d70: 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  te->nRef++;.    
5d80: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
5d90: 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  x();.       retu
5da0: 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20  rn pCandidate;. 
5db0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
5dc0: 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e  o match was foun
5dd0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65  d.  We will make
5de0: 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a   a new file ID *
5df0: 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d  /.  pNew->nRef =
5e00: 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d   1;.  pNew->nNam
5e10: 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = n;.  pNew->p
5e20: 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69  Next = vxworksFi
5e30: 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b  leList;.  vxwork
5e40: 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77  sFileList = pNew
5e50: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
5e60: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ex();.  return p
5e70: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
5e80: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
5e90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61  rence count on a
5ea0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
5eb0: 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20  bject.  Free.** 
5ec0: 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20  the object when 
5ed0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
5ee0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
5ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5f00: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
5f10: 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77  ileId(struct vxw
5f20: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29  orksFileId *pId)
5f30: 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
5f40: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
5f50: 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pId->nRef>0 );. 
5f60: 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pId->nRef--;.  
5f70: 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30  if( pId->nRef==0
5f80: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76   ){.    struct v
5f90: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70  xworksFileId **p
5fa0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76  p;.    for(pp=&v
5fb0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
5fc0: 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b  *pp && *pp!=pId;
5fd0: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
5fe0: 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73  Next)){}.    ass
5ff0: 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b  ert( *pp==pId );
6000: 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e  .    *pp = pId->
6010: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6020: 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20  e3_free(pId);.  
6030: 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
6040: 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ex();.}.#endif /
6050: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
6060: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6070: 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46   End of Unique F
6080: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
6090: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
60a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
60b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6100: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f  ************* Po
6170: 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
6180: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
6190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61a0: 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64  *.**.** POSIX ad
61b0: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65  visory locks are
61c0: 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67   broken by desig
61d0: 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  n.  ANSI STD 100
61e0: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
61f0: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
6200: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
6210: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
6220: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
6230: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
6240: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
6250: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
6260: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
6270: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
6280: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
6290: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
62a0: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
62b0: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
62c0: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
62d0: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
62e0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
62f0: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
6300: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
6310: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
6320: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
6330: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
6340: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
6350: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
6360: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
6370: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
6380: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
6390: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
63a0: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
63b0: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
63c0: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
63d0: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
63e0: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
63f0: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
6400: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
6410: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
6420: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
6430: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6440: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
6450: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
6460: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
6470: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
6480: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
6490: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
64a0: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
64b0: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
64c0: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
64d0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
64e0: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
64f0: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
6500: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
6510: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
6520: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
6530: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
6540: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
6550: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
6560: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
6570: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6580: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
6590: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
65a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
65b0: 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ns that we canno
65c0: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
65d0: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
65e0: 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20   file access.** 
65f0: 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20  among competing 
6600: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
6610: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
6620: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
6630: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
6640: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
6650: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
6660: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
6670: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
6680: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
6690: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
66a0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
66b0: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
66c0: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
66d0: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
66e0: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
66f0: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
6700: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
6710: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
6720: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
6730: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
6740: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
6750: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
6760: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
6770: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
6780: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
6790: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
67a0: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
67b0: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
67c0: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
67d0: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
67e0: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
67f0: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
6800: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
6810: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
6820: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
6830: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
6840: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
6850: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
6860: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
6870: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
6880: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
6890: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
68a0: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41   inode..**.** (A
68b0: 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66  side: The use of
68c0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61   inode numbers a
68d0: 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65  s unique IDs doe
68e0: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
68f0: 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78  Works..** For Vx
6900: 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74  Works, we have t
6910: 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e  o use the altern
6920: 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20  ative unique ID 
6930: 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a  system based on.
6940: 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  ** canonical fil
6950: 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d  ename and implem
6960: 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ented in the pre
6970: 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29  vious division.)
6980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
6990: 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
69a0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
69b0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
69c0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
69d0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
69e0: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
69f0: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
6a00: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
6a10: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
6a20: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
6a30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6a40: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
6a50: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
6a60: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
6a70: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
6a80: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
6a90: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
6aa0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
6ab0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
6ac0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
6ad0: 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74  both unixFile st
6ae0: 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e  ructures.** poin
6af0: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f  t to the same lo
6b00: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  cking structure.
6b10: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74    The locking st
6b20: 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a  ructure keeps.**
6b30: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
6b40: 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b  nt (so we will k
6b50: 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65  now when to dele
6b60: 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e  te it) and a "cn
6b70: 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  t".** field that
6b80: 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e   tells us its in
6b90: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  ternal lock stat
6ba0: 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e  us.  cnt==0 mean
6bb0: 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  s the.** file is
6bc0: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d   unlocked.  cnt=
6bd0: 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69  =-1 means the fi
6be0: 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  le has an exclus
6bf0: 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74  ive lock..** cnt
6c00: 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  >0 means there a
6c10: 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f  re cnt shared lo
6c20: 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  cks on the file.
6c30: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d  .**.** Any attem
6c40: 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  pt to lock or un
6c50: 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73  lock a file firs
6c60: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63  t checks the loc
6c70: 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  king.** structur
6c80: 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20  e.  The fcntl() 
6c90: 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f  system call is o
6ca0: 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73  nly invoked to s
6cb0: 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c  et a .** POSIX l
6cc0: 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ock if the inter
6cd0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75  nal lock structu
6ce0: 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  re transitions b
6cf0: 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b  etween.** a lock
6d00: 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b  ed and an unlock
6d10: 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
6d20: 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65  But wait:  there
6d30: 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72   are yet more pr
6d40: 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49  oblems with POSI
6d50: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
6d60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ..**.** If you c
6d70: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
6d80: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
6d90: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
6da0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
6db0: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
6dc0: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
6dd0: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
6de0: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
6df0: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
6e00: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
6e10: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
6e20: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
6e30: 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69  bject.** maintai
6e40: 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ns a count of th
6e50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  e number of pend
6e60: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  ing locks on tha
6e70: 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20   inode..** When 
6e80: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
6e90: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
6ea0: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
6eb0: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
6ec0: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
6ed0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
6ee0: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
6ef0: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
6f00: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
6f10: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
6f20: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
6f30: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
6f40: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
6f50: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
6f60: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
6f70: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
6f80: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
6f90: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
6fa0: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
6fb0: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
6fc0: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
6fd0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
6fe0: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
6ff0: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
7000: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
7010: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
7020: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
7030: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
7040: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
7050: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
7060: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
7070: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
7080: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
7090: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
70a0: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
70b0: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
70c0: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
70d0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
70e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
70f0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
7100: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
7110: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
7120: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
7130: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
7140: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
7150: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
7160: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
7170: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
7180: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
7190: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
71a0: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
71b0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
71c0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
71d0: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
71e0: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
71f0: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
7200: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
7210: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
7220: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
7230: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
7240: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
7250: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
7260: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
7270: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
7280: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
7290: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
72a0: 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20  ..** One has to 
72b0: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
72c0: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
72d0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
72e0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
72f0: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  rocess..**.** SQ
7300: 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70  Lite used to sup
7310: 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64  port LinuxThread
7320: 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20  s.  But support 
7330: 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  for LinuxThreads
7340: 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20  .** was dropped 
7350: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  beginning with v
7360: 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53  ersion 3.7.0.  S
7370: 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c  QLite will still
7380: 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69   work with.** Li
7390: 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69  nuxThreads provi
73a0: 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65  ded that (1) the
73b0: 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68  re is no more th
73c0: 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f  an one connectio
73d0: 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61  n .** per databa
73e0: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73  se file in the s
73f0: 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ame process and 
7400: 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e  (2) database con
7410: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e  nections.** do n
7420: 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74  ot move across t
7430: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
7440: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
7450: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7460: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
7470: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
7480: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
7490: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e  articular unixIn
74a0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
74b0: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
74c0: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
74d0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
74e0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
74f0: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
7500: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
7510: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
7520: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
7530: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
7540: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
7550: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
7560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7570: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
7580: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
7590: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
75a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
75b0: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
75c0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
75d0: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
75e0: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
75f0: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
7600: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
7610: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
7620: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
7630: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
7640: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
7650: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
7660: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
7670: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
7680: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
7690: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
76a0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
76b0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
76c0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
76d0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
76e0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
76f0: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
7700: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
7710: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
7720: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
7730: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
7740: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
7750: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
7760: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
7790: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
77a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
77b0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
77c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
77d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
77e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
77f0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7800: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
7810: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
7820: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
7830: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
7840: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
7870: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
7880: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
7890: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
78a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
78b0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
78c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
78d0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
78e0: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7900: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
7910: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
7920: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
7930: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
7940: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
7950: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7960: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
7970: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
7980: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
7990: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
79a0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
79b0: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
79c0: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
79d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
79e0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
79f0: 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  d */.#if defined
7a00: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
7a10: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20  OCKING_STYLE).  
7a20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
7a30: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
7a40: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
7a50: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
7a60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
7a70: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
7a80: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7aa0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
7ab0: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
7ac0: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
7ad0: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
7ae0: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
7af0: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
7b00: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
7b10: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
7b20: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
7b30: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
7b40: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
7b50: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
7b60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
7b70: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
7b80: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
7b90: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
7ba0: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
7bb0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
7bc0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
7bd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7be0: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
7bf0: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
7c00: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
7c10: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
7c20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
7c30: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
7c40: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
7c50: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
7c60: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
7c70: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
7c80: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
7c90: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
7ca0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
7cb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
7cc0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
7cd0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
7ce0: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
7cf0: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
7d00: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
7d10: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
7d20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
7d30: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
7d40: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
7d50: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
7d60: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
7d70: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
7d80: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
7d90: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
7da0: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
7db0: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65  en") and the the
7dc0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
7dd0: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
7de0: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
7df0: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
7e00: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
7e10: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
7e20: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
7e30: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
7e40: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
7e50: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
7e80: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
7e90: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
7eb0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
7ec0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
7ed0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
7ee0: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
7ef0: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
7f00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
7f10: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
7f20: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
7f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
7f40: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
7f50: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
7f60: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
7f70: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f90: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
7fa0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
7fb0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
7fc0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
7fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
7fe0: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
7ff0: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
8000: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
8010: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
8020: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
8030: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
8040: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
8050: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
8060: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
8070: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
8080: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
8090: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
80a0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
80b0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
80c0: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
80d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
80e0: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
80f0: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
8100: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
8110: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
8120: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
8130: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
8140: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
8150: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
8160: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
8170: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
8180: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
8190: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
81a0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
81b0: 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 73  the the GNU vers
81c0: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
81d0: 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72  r() that .  ** r
81e0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
81f0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
8200: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
8210: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
8220: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
8230: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
8240: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
8250: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
8260: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
8270: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
8280: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
8290: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
82a0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
82b0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
82c0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
82d0: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
82e0: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
82f0: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
8300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8310: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
8320: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
8330: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
8340: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
8350: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
8360: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
8370: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
8380: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8390: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
83a0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
83b0: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
83c0: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
83d0: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
83e0: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
83f0: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
8400: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
8410: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
8420: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
8430: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
8440: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
8450: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
8460: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
8470: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
8480: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
8490: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
84a0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
84b0: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
84c0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
84d0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
84e0: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
84f0: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
8500: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
8510: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
8520: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
8530: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
8540: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8550: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
8560: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
8570: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
8580: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
8590: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
85a0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
85b0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
85c0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
85d0: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
85e0: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
85f0: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
8600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
8610: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8620: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
8630: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
8640: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
8650: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
8660: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
8670: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
8680: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
8690: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
86a0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
86b0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
86c0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
86d0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
86e0: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
86f0: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
8700: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8710: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
8720: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
8730: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
8740: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
8750: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
8760: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8770: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
8780: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
8790: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
87a0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
87b0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
87c0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
87d0: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
87e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
87f0: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
8800: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
8810: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
8820: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
8830: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
8840: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
8850: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
8860: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
8890: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
88a0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
88b0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
88c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
88d0: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
88e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
88f0: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
8900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
8910: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
8920: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
8930: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
8940: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
8950: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
8960: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
8970: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
8980: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
8990: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
89a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
89b0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
89c0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
89d0: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
89e0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
89f0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
8a00: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
8a10: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
8a20: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
8a30: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
8a40: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
8a50: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
8a60: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
8a70: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
8a80: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
8a90: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
8aa0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
8ab0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
8ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
8ad0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
8ae0: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
8af0: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
8b00: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
8b10: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
8b20: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
8b30: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
8b40: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
8b50: 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
8b60: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
8b70: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
8b80: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
8b90: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8ba0: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
8bb0: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
8bc0: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
8bd0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
8be0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
8bf0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
8c00: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
8c10: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
8c20: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
8c30: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
8c40: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
8c50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8c60: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
8c70: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
8c80: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
8c90: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
8ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8cb0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
8cc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8cd0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
8ce0: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
8cf0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
8d00: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
8d10: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
8d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8d30: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
8d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8d50: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
8d60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
8d70: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
8d80: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
8d90: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
8da0: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
8db0: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
8dc0: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
8dd0: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
8de0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
8df0: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
8e00: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
8e10: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
8e20: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
8e30: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
8e40: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
8e50: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
8e60: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
8e70: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
8e80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
8e90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
8ea0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8eb0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
8ec0: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
8ed0: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
8ee0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
8ef0: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
8f00: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
8f10: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
8f20: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
8f30: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8f40: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
8f50: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
8f60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
8f90: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
8fa0: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
8fd0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
8fe0: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
8ff0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
9000: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
9010: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
9020: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
9030: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
9040: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
9050: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
9060: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
9070: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9080: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
9090: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
90a0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90b0: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
90c0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
90d0: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
90e0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
90f0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
9100: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
9110: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
9120: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
9130: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
9140: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
9150: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
9160: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
9170: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
9180: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
9190: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
91a0: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
91b0: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
91c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
91d0: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
91e0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
91f0: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
9200: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
9210: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
9220: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
9230: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
9240: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
9250: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
9260: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
9270: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
9280: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
9290: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
92a0: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
92b0: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
92c0: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
92d0: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
92e0: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
92f0: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
9300: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
9310: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
9320: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
9330: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
9340: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
9350: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
9360: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
9370: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
9380: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
9390: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
93a0: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
93b0: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
93c0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
93d0: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
93e0: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
93f0: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
9400: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
9410: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
9420: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
9430: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
9440: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
9450: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
9460: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
9470: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
9480: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
9490: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
94a0: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
94b0: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
94c0: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
94d0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
94e0: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
94f0: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
9500: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
9510: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
9520: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
9530: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
9540: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9550: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
9560: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
9570: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
9580: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
9590: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
95a0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
95b0: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
95c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
95d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
95e0: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
95f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
9600: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
9610: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
9620: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
9630: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
9640: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
9650: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
9660: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
9670: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
9680: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
9690: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
96a0: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
96b0: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
96c0: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
96d0: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
96e0: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
96f0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
9700: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
9710: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
9720: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
9730: 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  pInode) );.    i
9740: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
9750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9760: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
9770: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
9780: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
9790: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
97a0: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
97b0: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
97c0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
97d0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
97e0: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
97f0: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
9800: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
9810: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
9820: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
9830: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
9840: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
9850: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
9860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9870: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
9880: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
9890: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
98a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
98b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
98c0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
98d0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
98e0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
98f0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
9900: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
9910: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
9920: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
9930: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
9940: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
9950: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
9960: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
9970: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
9980: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
9990: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
99a0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
99b0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
99c0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
99d0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
99e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
99f0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
9a00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9a10: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
9a20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9a30: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
9a40: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
9a50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
9a60: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
9a70: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9a80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9a90: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
9aa0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
9ab0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
9ac0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9ad0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
9ae0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
9af0: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
9b00: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
9b10: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
9b20: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
9b30: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
9b40: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
9b50: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
9b60: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
9b70: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
9b80: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
9b90: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
9ba0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9bb0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
9bc0: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
9bd0: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
9be0: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
9bf0: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
9c00: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
9c10: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
9c20: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
9c30: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
9c40: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
9c50: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
9c60: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9c70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
9c80: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
9c90: 20 69 66 20 28 2d 31 20 3d 3d 20 6f 73 46 63 6e   if (-1 == osFcn
9ca0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
9cb0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a  ETLK, &lock)) {.
9cc0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
9cd0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
9ce0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
9cf0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
9d00: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
9d10: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
9d20: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46  DLOCK);.      pF
9d30: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9d40: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65   tErrno;.    } e
9d50: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
9d60: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
9d70: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
9d80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
9d90: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
9da0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
9db0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
9dc0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
9dd0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
9de0: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
9df0: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
9e00: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
9e10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9e20: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
9e30: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
9e40: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
9e50: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
9e60: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
9e70: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
9e80: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
9e90: 6e 65 64 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78  ned from unix-ex
9ea0: 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c  cl, then the onl
9eb0: 79 20 6c 6f 63 6b 20 65 76 65 72 0a 2a 2a 20 6f  y lock ever.** o
9ec0: 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78  btained is an ex
9ed0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e  clusive lock, an
9ee0: 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  d it is obtained
9ef0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a   exactly once.**
9f00: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
9f10: 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  any lock is atte
9f20: 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  mpted.  All subs
9f30: 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f  equent system lo
9f40: 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  cking.** operati
9f50: 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70  ons become no-op
9f60: 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72  s.  Locking oper
9f70: 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70  ations still hap
9f80: 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a  pen internally,.
9f90: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
9fa0: 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  oordinate access
9fb0: 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74   between separat
9fc0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
9fd0: 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e  ctions.** within
9fe0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62   this process, b
9ff0: 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69  ut all of that i
a000: 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d  s handled in mem
a010: 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f  ory and the.** o
a020: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
a030: 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69  does not partici
a040: 70 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pate..*/.static 
a050: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
a060: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a070: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
a080: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
a090: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
a0a0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
a0b0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
a0c0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
a0d0: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
a0e0: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
a0f0: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72   if( (pFile->ctr
a100: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
a110: 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49  E_EXCL)!=0 || pI
a120: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
a130: 63 6b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ck ){.    if( pI
a140: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
a150: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
a160: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
a170: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a180: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
a190: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
a1a0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a1b0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
a1c0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
a1d0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
a1e0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
a1f0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
a200: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
a210: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
a220: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
a230: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a240: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
a250: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a260: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
a270: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
a280: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
a290: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
a2a0: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
a2b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
a2c0: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
a2d0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
a2e0: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
a2f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a300: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
a310: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
a320: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
a330: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
a340: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
a350: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
a360: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
a370: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
a380: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
a390: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
a3a0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
a3b0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
a3c0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
a3d0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
a3e0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
a3f0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
a400: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
a410: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
a420: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
a430: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
a440: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
a450: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
a460: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
a470: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
a480: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
a490: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
a4a0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
a4b0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
a4c0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
a4d0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
a4e0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
a4f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
a500: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
a510: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
a520: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
a530: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
a540: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
a550: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
a560: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
a570: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
a580: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
a590: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
a5a0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
a5b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a5c0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
a5d0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
a5e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
a5f0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
a600: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
a610: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
a620: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
a630: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
a640: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
a650: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
a660: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
a670: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
a680: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
a690: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
a6a0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
a6b0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
a6c0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
a6d0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
a6e0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
a6f0: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
a700: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
a710: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
a720: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
a730: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
a740: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
a750: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
a760: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
a770: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
a780: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
a790: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
a7a0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
a7b0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
a7c0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
a7d0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
a7e0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
a7f0: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
a800: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
a810: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
a820: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
a830: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
a840: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
a850: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
a860: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
a870: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
a880: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
a890: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
a8a0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a8b0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
a8c0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
a8d0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
a8e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
a8f0: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
a900: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
a910: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
a920: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
a930: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
a940: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
a950: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
a960: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
a970: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
a980: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
a990: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
a9a0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
a9b0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
a9c0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
a9d0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
a9e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
a9f0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
aa00: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
aa10: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
aa20: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
aa30: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
aa40: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
aa50: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
aa60: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
aa70: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
aa80: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
aa90: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
aaa0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
aab0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
aac0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
aad0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
aae0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
aaf0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
ab00: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
ab10: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
ab20: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
ab30: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
ab40: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
ab50: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
ab60: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
ab70: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
ab80: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
ab90: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
aba0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
abb0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
abc0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
abd0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
abe0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
abf0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
ac00: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
ac10: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
ac20: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
ac30: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
ac40: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
ac50: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
ac60: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
ac70: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
ac80: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
ac90: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
aca0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
acb0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
acc0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
acd0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
ace0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
acf0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
ad00: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
ad10: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
ad20: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
ad30: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
ad40: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
ad50: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
ad60: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
ad70: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
ad80: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
ad90: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
ada0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
adb0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
adc0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
add0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
ade0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
adf0: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
ae00: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
ae10: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
ae20: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
ae30: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
ae40: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
ae50: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
ae60: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
ae70: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
ae80: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
ae90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
aea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
aeb0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
aec0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
aed0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
aee0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
aef0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
af00: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
af10: 20 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 45   s = 0;.  int tE
af20: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
af30: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
af40: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
af50: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
af60: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
af70: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
af80: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
af90: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
afa0: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
afb0: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
afc0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
afd0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
afe0: 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
aff0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
b000: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b010: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
b020: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
b030: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
b040: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
b050: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
b060: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
b070: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
b080: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
b090: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
b0a0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
b0b0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
b0c0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
b0d0: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
b0e0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
b0f0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
b100: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
b110: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
b120: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
b130: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
b140: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
b150: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b160: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
b170: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
b180: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
b190: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
b1a0: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
b1b0: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
b1c0: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
b1d0: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
b1e0: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
b1f0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
b200: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
b210: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
b220: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
b230: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
b240: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
b250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
b260: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
b270: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
b280: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
b290: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
b2a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b2b0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
b2c0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
b2d0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
b2e0: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
b2f0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
b300: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b310: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
b320: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
b330: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
b340: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
b350: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
b360: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
b370: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
b380: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
b390: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
b3a0: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
b3b0: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
b3c0: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
b3d0: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
b3e0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
b3f0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
b400: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
b410: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
b420: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
b430: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
b440: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
b450: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
b460: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
b470: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
b480: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
b490: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
b4a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b4b0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b4c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
b4d0: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
b4e0: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
b4f0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
b500: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
b510: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
b520: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
b530: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
b540: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
b550: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
b560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
b570: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
b580: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b590: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
b5a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
b5b0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
b5c0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
b5d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
b5e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
b5f0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
b600: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
b610: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
b620: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
b630: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
b640: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
b650: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
b660: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
b670: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
b680: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
b690: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
b6a0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b6b0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
b6c0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
b6d0: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
b6e0: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
b6f0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
b700: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
b710: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
b720: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
b730: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
b740: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
b750: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
b760: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
b770: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b780: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
b790: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
b7a0: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
b7b0: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
b7c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
b7d0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
b7e0: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
b7f0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
b800: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
b810: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
b820: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
b830: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
b840: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
b850: 3b 0a 20 20 20 20 73 20 3d 20 75 6e 69 78 46 69  ;.    s = unixFi
b860: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
b870: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 3d  ock);.    if( s=
b880: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74  =(-1) ){.      t
b890: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
b8a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b8b0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
b8c0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
b8d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
b8e0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
b8f0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
b900: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b910: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
b920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b930: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
b940: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
b950: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
b960: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
b970: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
b980: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
b990: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
b9a0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
b9b0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
b9c0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
b9d0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
b9e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
b9f0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
ba00: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
ba10: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
ba20: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  ileLock==0 );.. 
ba30: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
ba40: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
ba50: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ba60: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
ba70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ba80: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
ba90: 20 20 69 66 28 20 28 73 20 3d 20 75 6e 69 78 46    if( (s = unixF
baa0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
bab0: 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20 29 7b 0a  lock))==(-1) ){.
bac0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
bad0: 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
bae0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
baf0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
bb00: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
bb10: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
bb20: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
bb30: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
bb40: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
bb50: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
bb60: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
bb70: 65 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a  e, &lock)!=0 ){.
bb80: 20 20 20 20 20 20 69 66 28 20 73 20 21 3d 20 2d        if( s != -
bb90: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
bba0: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
bbb0: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
bbc0: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
bbd0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
bbe0: 3b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ; .        rc = 
bbf0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
bc00: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
bc10: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
bc20: 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20  NLOCK); .       
bc30: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
bc40: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
bc50: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
bc60: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
bc70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bc80: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
bc90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bca0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b    if( s==(-1) ){
bcb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bcc0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
bcd0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
bce0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
bcf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
bd00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
bd10: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
bd20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
bd30: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
bd40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
bd50: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
bd60: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
bd70: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
bd80: 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
bd90: 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
bda0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
bdb0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
bdc0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
bdd0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
bde0: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
bdf0: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
be00: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
be10: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
be20: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
be30: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
be40: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
be50: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
be60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
be70: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
be80: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
be90: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
bea0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
beb0: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
bec0: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
bed0: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
bee0: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
bef0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
bf00: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
bf10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
bf20: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
bf30: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c  ileLock );.    l
bf40: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
bf50: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
bf60: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
bf70: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
bf80: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
bf90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bfa0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bfb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bfc0: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
bfd0: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
bfe0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bff0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c000: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c010: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c020: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c030: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
c040: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
c050: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 75  .    }.    s = u
c060: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c070: 65 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  e, &lock);.    i
c080: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
c090: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
c0a0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
c0b0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c0c0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c0d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
c0e0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
c0f0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
c100: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
c110: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
c120: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
c130: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
c140: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
c150: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
c160: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
c170: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
c180: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
c190: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
c1a0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
c1b0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
c1c0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
c1d0: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
c1e0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
c1f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
c200: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
c210: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
c220: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
c230: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
c240: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c250: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
c260: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
c270: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
c280: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
c290: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
c2a0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
c2b0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
c2c0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
c2d0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
c2e0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
c2f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
c300: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c310: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
c320: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
c330: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
c340: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
c350: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
c360: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
c370: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c380: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
c390: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
c3a0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
c3b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
c3c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
c3d0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
c3e0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
c3f0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
c400: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
c410: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
c420: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
c430: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
c440: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
c450: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
c460: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
c470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
c480: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
c490: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
c4a0: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
c4b0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
c4c0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
c4d0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
c4e0: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
c4f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
c500: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
c510: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
c520: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
c530: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
c540: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
c550: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
c560: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
c570: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
c580: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
c590: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
c5a0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
c5b0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
c5c0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
c5d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
c5e0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
c5f0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
c600: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c610: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
c620: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
c630: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
c640: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
c650: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
c660: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
c670: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
c680: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
c690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c6a0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
c6b0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
c6c0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
c6d0: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
c6e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
c6f0: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
c700: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
c710: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
c720: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
c730: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
c740: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
c750: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
c760: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
c770: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
c780: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
c790: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
c7a0: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
c7b0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
c7c0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
c7d0: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
c7e0: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
c7f0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
c800: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
c810: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
c820: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
c830: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
c840: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
c850: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
c860: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
c870: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
c880: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
c890: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
c8a0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
c8b0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
c8c0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
c8d0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68 3b  ITE_OK;.  int h;
c8e0: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20  .  int tErrno;  
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
c910: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
c920: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20  ll errors */..  
c930: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
c940: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
c950: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
c960: 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
c970: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
c980: 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
c990: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
c9a0: 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
c9b0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
c9c0: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
c9d0: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
c9e0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
c9f0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
ca00: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ca10: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
ca20: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
ca30: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
ca40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ca50: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ca60: 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65 2d  ();.  h = pFile-
ca70: 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  >h;.  pInode = p
ca80: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ca90: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
caa0: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
cab0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
cac0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
cad0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cae0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
caf0: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
cb00: 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
cb10: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
cb20: 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
cb30: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
cb40: 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
cb50: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
cb60: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
cb70: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
cb80: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
cb90: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
cba0: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
cbb0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
cbc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
cbd0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
cbe0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
cbf0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
cc00: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
cc10: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
cc20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
cc30: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
cc40: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
cc50: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
cc60: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
cc70: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
cc80: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
cc90: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
cca0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
ccb0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
ccc0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
ccd0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
cce0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
ccf0: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
cd00: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
cd10: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
cd20: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
cd30: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
cd40: 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20 61    */.#if 0.    a
cd50: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
cd60: 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
cd70: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
cd80: 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
cd90: 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
cda0: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
cdb0: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1 );.#endif.    
cdc0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
cdd0: 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
cde0: 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
cdf0: 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
ce00: 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
ce10: 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
ce20: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
ce30: 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
ce40: 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
ce50: 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
ce60: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
ce70: 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
ce80: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
ce90: 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
cea0: 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
ceb0: 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
cec0: 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
ced0: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
cee0: 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
cef0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
cf00: 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
cf10: 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
cf20: 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
cf30: 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
cf40: 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
cf50: 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
cf60: 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
cf70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
cf80: 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69 6e  K ){..#if !defin
cf90: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
cfa0: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
cfb0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
cfc0: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
cfd0: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
cfe0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
cff0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
d000: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d010: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
d020: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
d030: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
d040: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
d050: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
d060: 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d   off_t divSize =
d070: 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31   SHARED_SIZE - 1
d080: 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
d090: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d0a0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d0b0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d0c0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d0d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d0e0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
d0f0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d100: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
d110: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
d120: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 2c 20  ileLock(pFile,, 
d130: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d140: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d150: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d160: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d170: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d180: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d190: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
d1a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d1b0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d1d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d1e0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d200: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d220: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d230: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
d240: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d250: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d260: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d270: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d280: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d290: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
d2b0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d2c0: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d2d0: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d2e0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d2f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d300: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d310: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d320: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
d330: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d340: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d360: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d370: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d390: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d3a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d3b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d3c0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
d3d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
d3e0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
d3f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d400: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
d410: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
d420: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
d430: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
d440: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
d450: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
d460: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
d470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
d480: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
d490: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d4a0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d4b0: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d4c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d4d0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  CK);.          i
d4e0: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
d4f0: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
d500: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d510: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
d520: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d530: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
d540: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lock;.        }.
d550: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
d560: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
d570: 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
d580: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
d590: 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20  G_STYLE */.     
d5a0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   {.        lock.
d5b0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
d5c0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
d5d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
d5e0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
d5f0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d600: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
d610: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d620: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
d630: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
d640: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
d650: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
d660: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d670: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
d680: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d690: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d6a0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d6b0: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
d6c0: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
d6d0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
d6f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d700: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
d710: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
d720: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
d730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d740: 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
d750: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
d760: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d770: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d780: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
d790: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
d7a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
d7b0: 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
d7c0: 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
d7d0: 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
d7e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
d7f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
d800: 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  !=(-1) ){.      
d810: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d820: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d830: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d840: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d850: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d860: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
d870: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
d880: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d890: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
d8a0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
d8c0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
d8d0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
d8e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
d8f0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
d900: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d910: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d920: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d930: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
d940: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
d950: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
d960: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
d970: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
d980: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
d990: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
d9a0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
d9b0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
d9c0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
d9d0: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
d9e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d9f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
da00: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
da10: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
da20: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
da30: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
da40: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
da50: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 53  en = 0L;.      S
da60: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
da70: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
da80: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
da90: 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
daa0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
dab0: 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
dac0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dad0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 21 3d 28  pFile, &lock)!=(
dae0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  -1) ){.        p
daf0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
db00: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
db10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
db30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
db40: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
db50: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
db60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
db70: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
db80: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
db90: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
dba0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
dbb0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
dbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49      }.        pI
dbd0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
dbe0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
dbf0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
dc00: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
dc10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dc20: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
dc30: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
dc40: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
dc50: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
dc60: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
dc70: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
dc80: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
dc90: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
dca0: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
dcb0: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
dcc0: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
dcd0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
dce0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
dcf0: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
dd00: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
dd10: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
dd20: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
dd30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
dd40: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
dd50: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a  e);.    }.  }...
dd60: 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e  end_unlock:.  un
dd70: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
dd80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd90: 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
dda0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
ddb0: 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
ddc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
ddd0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
dde0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
ddf0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
de00: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
de10: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
de20: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
de30: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
de40: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
de50: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
de60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
de70: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
de80: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
de90: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
dea0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
deb0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
dec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
ded0: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
dee0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
def0: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
df00: 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
df10: 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
df20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
df30: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
df40: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
df50: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
df60: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
df70: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
df80: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
df90: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
dfa0: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
dfb0: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
dfc0: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
dfd0: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
dfe0: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
dff0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
e000: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
e010: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
e020: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
e030: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
e040: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
e050: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
e060: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
e070: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
e080: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
e090: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
e0a0: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
e0b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e0c0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
e0d0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e0e0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
e0f0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e100: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
e110: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
e120: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
e130: 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
e140: 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
e150: 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  dirfd, __LINE__)
e160: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
e170: 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 7d 0a 20  irfd=-1;.    }. 
e180: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
e190: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
e1a0: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
e1b0: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
e1c0: 5f 5f 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  __);.      pFile
e1d0: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
e1e0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
e1f0: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
e200: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
e210: 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29  File->isDelete )
e220: 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b  {.        unlink
e230: 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61  (pFile->pId->zCa
e240: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
e250: 20 20 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f      }.      vxwo
e260: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
e270: 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
e280: 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
e290: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
e2a0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43  .    OSTRACE(("C
e2b0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
e2c0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
e2d0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
e2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
e2f0: 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  e(pFile->pUnused
e300: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  );.    memset(pF
e310: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
e320: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20  nixFile));.  }. 
e330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e340: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
e350: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
e360: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
e370: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
e380: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
e390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
e3a0: 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
e3b0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
e3c0: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20  ixFile *)id;.   
e3d0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
e3e0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
e3f0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
e400: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
e410: 65 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 7c 7c 20  e->pInode==0 || 
e420: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
e430: 4c 6f 63 6b 3e 30 0a 20 20 20 20 20 20 20 20 20  Lock>0.         
e440: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e     || pFile->pIn
e450: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
e460: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k==0 );.    if( 
e470: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  pFile->pInode &&
e480: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
e490: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  nLock ){.      /
e4a0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
e4b0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
e4c0: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
e4d0: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
e4e0: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79   just.      ** y
e4f0: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
e500: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
e510: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
e520: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
e530: 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
e540: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
e550: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
e560: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
e570: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
e580: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
e590: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
e5a0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
e5b0: 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
e5c0: 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
e5d0: 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
e5e0: 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
e5f0: 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
e600: 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
e610: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e630: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
e640: 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
e650: 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
e660: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
e670: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
e680: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6d0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e740: 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
e750: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e770: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
e780: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
e790: 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
e7a0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
e7b0: 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
e7c0: 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
e7d0: 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
e7e0: 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
e7f0: 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
e800: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
e810: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
e820: 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
e830: 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
e840: 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
e850: 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
e860: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
e870: 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
e880: 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
e890: 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
e8a0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
e8b0: 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
e8c0: 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
e8d0: 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
e8e0: 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
e8f0: 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
e900: 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
e910: 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
e920: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e930: 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
e940: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
e950: 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
e960: 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
e970: 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
e980: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
e990: 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
e9a0: 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
e9b0: 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
e9c0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
e9d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e9e0: 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
e9f0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
ea00: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
ea10: 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
ea20: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
ea30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
ea40: 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
ea50: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ea60: 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
ea70: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
ea80: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
ea90: 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
eaa0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
eab0: 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
eac0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
ead0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
eae0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
eaf0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
eb00: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
eb10: 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
eb20: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
eb30: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
eb40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb50: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
eb60: 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
eb70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
eb80: 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
eb90: 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
eba0: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
ebb0: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
ebc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ebd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
ebe0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
ebf0: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
ec00: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ec10: 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
ec20: 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
ec30: 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}../*********
ec40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
ec50: 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
ec60: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ec70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec80: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
ec90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecd0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
ece0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed20: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
ed30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed40: 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
ed50: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
ed60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed70: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
ed80: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
ed90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
eda0: 75 73 65 73 20 74 68 65 20 65 78 69 73 74 61 6e  uses the existan
edb0: 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
edc0: 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20  ock.** files in 
edd0: 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c  order to control
ede0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
edf0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77  atabase.  This w
ee00: 6f 72 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20  orks on just.** 
ee10: 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65  about every file
ee20: 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c  system imaginabl
ee30: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
ee40: 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69  e serious downsi
ee50: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  des:.**.**    (1
ee60: 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f  )  There is zero
ee70: 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41   concurrency.  A
ee80: 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62   single reader b
ee90: 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a  locks all other.
eea0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65  **         conne
eeb0: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64  ctions from read
eec0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
eed0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
eee0: 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70  **    (2)  An ap
eef0: 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20  plication crash 
ef00: 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61  or power loss ca
ef10: 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f  n leave stale lo
ef20: 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20  ck files.**     
ef30: 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75      sitting arou
ef40: 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  nd that need to 
ef50: 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61  be cleared manua
ef60: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72  lly..**.** Never
ef70: 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f  theless, a dotlo
ef80: 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72  ck is an appropr
ef90: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  iate locking mod
efa0: 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a  e for use if no.
efb0: 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  ** other locking
efc0: 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61   strategy is ava
efd0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  ilable..**.** Do
efe0: 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f  tfile locking wo
eff0: 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  rks by creating 
f000: 61 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  a file in the sa
f010: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
f020: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
f030: 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
f040: 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
f050: 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
f060: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
f070: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
f080: 20 6c 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69   lock file impli
f090: 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
f0a0: 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
f0b0: 20 6c 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28   lock.** types (
f0c0: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
f0d0: 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
f0e0: 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
f0f0: 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
f100: 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
f110: 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
f120: 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
f130: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
f140: 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66  te the.** lock f
f150: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
f160: 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
f170: 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
f180: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
f190: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
f1a0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
f1b0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
f1c0: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
f1d0: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
f1e0: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
f1f0: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
f200: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
f210: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
f220: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
f230: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
f240: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
f250: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
f260: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
f270: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
f280: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
f290: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
f2a0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
f2b0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
f2c0: 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
f2d0: 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
f2e0: 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
f2f0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
f300: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
f310: 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
f320: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
f330: 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
f340: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
f350: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
f360: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
f370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
f380: 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
f390: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
f3a0: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
f3b0: 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
f3c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f3d0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
f3e0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
f3f0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f400: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
f410: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
f420: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
f430: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
f440: 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
f450: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
f460: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
f470: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
f480: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
f490: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
f4a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
f4b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
f4c0: 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73    /* Either this
f4d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73   connection or s
f4e0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
f4f0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  tion in the same
f500: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
f510: 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20  holds a lock on 
f520: 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65  the file.  No ne
f530: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74  ed to check furt
f540: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65  her. */.    rese
f550: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  rved = 1;.  }els
f560: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  e{.    /* The lo
f570: 63 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e  ck is held if an
f580: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f  d only if the lo
f590: 63 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  ckfile exists */
f5a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f5b0: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f  *zLockFile = (co
f5c0: 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
f5d0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
f5e0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f5f0: 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69  osAccess(zLockFi
f600: 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20  le, 0)==0;.  }. 
f610: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
f620: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
f630: 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
f640: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
f650: 65 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73  erved));.  *pRes
f660: 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
f670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f680: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
f690: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
f6a0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
f6b0: 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
f6c0: 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
f6d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
f6e0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
f6f0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
f700: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
f710: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
f720: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
f730: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
f740: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
f750: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
f760: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
f770: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
f780: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
f790: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
f7a0: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
f7b0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
f7c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
f7d0: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
f7e0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
f7f0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
f800: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
f810: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
f820: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
f830: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
f840: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
f850: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
f860: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
f870: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
f880: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
f890: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
f8a0: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
f8b0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
f8c0: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
f8d0: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
f8e0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
f8f0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
f900: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
f910: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
f920: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
f930: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
f940: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
f950: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
f960: 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
f970: 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
f980: 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
f990: 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
f9a0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66  .**.** With dotf
f9b0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20  ile locking, we 
f9c0: 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70  really only supp
f9d0: 6f 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45  ort state (4): E
f9e0: 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74  XCLUSIVE..** But
f9f0: 20 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74   we track the ot
fa00: 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  her locking leve
fa10: 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a  ls internally..*
fa20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
fa30: 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
fa40: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
fa50: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
fa60: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fa70: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
fa80: 20 69 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20   int fd;.  char 
fa90: 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
faa0: 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
fab0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
fac0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fad0: 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
fae0: 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
faf0: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
fb00: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
fb10: 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
fb20: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
fb30: 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
fb40: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
fb50: 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
fb60: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
fb70: 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
fb80: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
fb90: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
fba0: 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57  ock;.#if !OS_VXW
fbb0: 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ORKS.    /* Alwa
fbc0: 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
fbd0: 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
fbe0: 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75  ld file */.    u
fbf0: 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
fc00: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
fc10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc20: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
fc30: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
fc40: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20  ve lock */.  fd 
fc50: 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4c  = robust_open(zL
fc60: 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59  ockFile,O_RDONLY
fc70: 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c  |O_CREAT|O_EXCL,
fc80: 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c  0600);.  if( fd<
fc90: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c  0 ){.    /* fail
fca0: 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ed to open/creat
fcb0: 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65  e the file, some
fcc0: 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76  one else may hav
fcd0: 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63  e stolen the loc
fce0: 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  k */.    int tEr
fcf0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fd00: 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
fd10: 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
fd20: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
fd30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
fd40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
fd50: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
fd60: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
fd70: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
fd80: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
fd90: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
fda0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
fdb0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
fdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fdd0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fde0: 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  } .  robust_clos
fdf0: 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
fe00: 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a 20  INE__);.  .  /* 
fe10: 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
fe20: 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
fe30: 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
fe40: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
fe50: 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
fe60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
fe70: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
fe80: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
fe90: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
fea0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
feb0: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
fec0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
fed0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
fee0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
fef0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
ff00: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
ff10: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
ff20: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
ff30: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
ff40: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
ff50: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
ff60: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
ff70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
ff80: 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
ff90: 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
ffa0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
ffb0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
ffc0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
ffd0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
ffe0: 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
fff0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10000 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
10010 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
10020 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
10030 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  ngContext;..  as
10040 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
10050 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
10060 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
10070 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
10080 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
10090 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46  FileLock,..   pF
100a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
100b0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
100c0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
100d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
100e0 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
100f0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
10100 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10110 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
10120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
10140 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
10150 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
10160 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
10170 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
10180 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
10190 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
101a0 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
101b0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
101c0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
101d0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
101e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
101f0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
10200 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
10210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10220 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
10230 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
10240 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
10250 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
10260 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
10270 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ==NO_LOCK );.  i
10280 66 28 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46  f( unlink(zLockF
10290 69 6c 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ile) ){.    int 
102a0 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rc = 0;.    int 
102b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
102c0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
102d0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
102e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
102f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10300 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10310 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
10320 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
10330 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
10340 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
10350 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10360 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  o;.    }.    ret
10370 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
10380 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10390 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
103a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
103b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
103c0 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
103d0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
103e0 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
103f0 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
10400 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
10410 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
10420 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
10430 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b   rc;.  if( id ){
10440 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
10450 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10460 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
10470 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
10480 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
10490 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
104a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
104b0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55   }.  rc = closeU
104c0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72  nixFile(id);.  r
104d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a  eturn rc;.}./***
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
104f0 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
10500 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
10510 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
105d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105e0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
105f0 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
10600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
10620 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
10630 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
10640 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
10650 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
10660 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
10670 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
10680 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
10690 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
106a0 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
106b0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
106c0 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
106d0 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
106e0 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
106f0 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
10700 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
10710 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
10720 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
10730 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
10740 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
10750 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
10760 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
10770 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
10780 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
10790 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
107a0 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
107b0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
107c0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
107d0 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
107e0 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
107f0 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
10800 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10810 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
10820 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63  d off or if.** c
10830 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57  ompiling for VXW
10840 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ORKS..*/.#if SQL
10850 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
10860 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
10870 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52  VXWORKS../*.** R
10880 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
10890 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
108a0 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
108b0 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
108c0 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
108d0 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
108e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
108f0 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
10900 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
10910 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
10920 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
10930 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
10940 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
10950 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
10960 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
10970 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10980 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
10990 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
109a0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
109b0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
109c0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
109d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
109e0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
109f0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
10a00 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
10a10 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
10a20 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
10a30 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
10a40 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
10a50 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
10a60 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
10a70 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
10a80 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
10a90 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
10aa0 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
10ab0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
10ac0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10ad0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
10ae0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10af0 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
10b00 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
10b10 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10b20 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
10b30 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10b50 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
10b60 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
10b70 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10b80 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
10b90 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
10ba0 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
10bb0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
10bc0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10bd0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
10be0 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
10bf0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
10c00 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
10c10 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
10c20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
10c30 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
10c40 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
10c50 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
10c60 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
10c70 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
10c80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10c90 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
10ca0 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
10cb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
10cc0 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
10cd0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
10ce0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
10cf0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
10d00 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
10d10 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
10d20 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
10d30 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
10d40 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
10d50 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
10d60 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
10d70 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10d80 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10d90 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10da0 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
10db0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
10dc0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
10dd0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10de0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
10df0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
10e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10e10 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
10e20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10e30 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
10e40 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
10e50 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
10e60 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
10e70 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20  reserved */.    
10e80 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
10e90 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10ea0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10eb0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20  _IOERR_LOCK); . 
10ec0 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
10ed0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
10ee0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
10ef0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
10f00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
10f10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
10f20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
10f30 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
10f40 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
10f50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
10f60 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
10f70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
10f80 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
10f90 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
10fa0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
10fb0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
10fc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10fd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
10fe0 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
10ff0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
11000 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11010 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
11020 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11040 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11050 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11060 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11070 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11080 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11090 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
110a0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
110b0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
110c0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
110d0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
110e0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
110f0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11100 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11110 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11120 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11130 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11140 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11150 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11160 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11170 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11180 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11190 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
111a0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
111b0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
111c0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
111d0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
111e0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
111f0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11200 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11210 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11220 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11230 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11240 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11250 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11260 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11270 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11280 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11290 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
112a0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
112b0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
112c0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
112d0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
112e0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
112f0 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
11300 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
11310 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
11320 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
11330 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
11340 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
11350 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
11360 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
11370 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
11380 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
11390 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
113a0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
113b0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
113c0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
113d0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
113e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
113f0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
11400 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
11410 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
11420 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
11430 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
11440 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11460 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11470 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11480 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
11490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
114a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
114b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
114c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
114d0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
114e0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
114f0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
11500 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
11510 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
11520 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
11530 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
11540 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
11550 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
11560 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11570 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11590 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
115a0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
115b0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
115c0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
115d0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
115e0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
115f0 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
11600 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
11610 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
11620 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
11630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
11640 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11650 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11660 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
11670 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11680 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
116a0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
116b0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
116c0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
116d0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
116e0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
116f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
11700 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
11710 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
11720 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
11730 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11740 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11750 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
11760 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
11770 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
11780 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
11790 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
117a0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
117b0 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
117c0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
117d0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
117e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
117f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11800 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
11810 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
11820 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
11830 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
11840 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11850 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
11860 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
11870 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
11880 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
11890 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
118a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
118b0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
118c0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
118d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
118e0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
118f0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
11900 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
11910 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
11920 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11940 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
11950 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
11960 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
11970 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11980 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11990 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
119a0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
119b0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
119c0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
119d0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
119e0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
119f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
11a00 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
11a10 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
11a20 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
11a30 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
11a40 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
11a50 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
11a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
11a70 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
11a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a90 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11aa0 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
11ab0 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
11ac0 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
11ad0 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
11ae0 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
11af0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
11b00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11b10 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11b30 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11b40 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
11b50 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
11b60 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11b70 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11b80 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  UN);.  if (rc) {
11b90 0a 20 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72  .    int r, tErr
11ba0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
11bb0 72 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  r = sqliteErrorF
11bc0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11bd0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11be0 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
11bf0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11c00 52 28 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46  R(r) ){.      pF
11c10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11c20 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23   tErrno;.    }.#
11c30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11c40 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
11c50 52 52 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72  RRORS.    if( (r
11c60 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
11c70 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
11c80 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51   ){.      r = SQ
11c90 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
11ca0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11cb0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
11cc0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
11cd0 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b    .    return r;
11ce0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
11cf0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11d00 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
11d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
11d30 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
11d40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
11d50 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
11d60 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
11d70 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55  id ){.    flockU
11d80 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
11d90 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
11da0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11db0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
11dc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11dd0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
11de0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
11e10 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
11e20 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11e90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ef0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
11f00 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
11f10 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
11f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11f30 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
11f40 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
11f50 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
11f60 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
11f70 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
11f80 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
11f90 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
11fa0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
11fb0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
11fc0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
11fd0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
11fe0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
11ff0 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
12000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12010 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
12020 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
12030 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
12040 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
12050 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
12060 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
12070 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
12080 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
12090 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
120a0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
120b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
120c0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
120d0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
120e0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
120f0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
12100 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12110 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12120 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12130 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12140 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12150 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12160 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12170 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12180 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12190 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
121a0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
121b0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
121c0 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
121d0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
121e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
121f0 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
12200 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12210 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
12220 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
12230 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12240 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
12250 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
12260 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
12270 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
12280 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
12290 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
122a0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
122b0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
122c0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
122d0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
122e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
122f0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
12300 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12310 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
12320 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
12330 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
12340 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
12350 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
12360 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
12370 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
12380 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
12390 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
123a0 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
123b0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
123c0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
123d0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
123e0 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
123f0 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
12400 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12410 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12420 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12430 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12440 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
12450 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12460 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
12470 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12480 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
12490 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
124a0 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
124b0 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
124c0 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
124d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
124e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
124f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12500 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
12510 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
12520 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
12530 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
12540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
12550 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12560 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
12570 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
12580 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
12590 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
125a0 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
125b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
125c0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
125d0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
125e0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
125f0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
12600 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
12610 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12620 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
12630 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12640 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12650 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
12660 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
12670 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
12680 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
12690 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
126a0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
126b0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
126c0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
126d0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
126e0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
126f0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
12700 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
12710 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
12720 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
12730 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
12740 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
12750 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
12760 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
12770 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
12780 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
12790 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
127a0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
127b0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
127c0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
127d0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
127e0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
127f0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
12800 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12810 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12820 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
12830 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
12840 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12850 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
12860 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
12870 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
12880 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
12890 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
128a0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
128b0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
128c0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
128d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
128e0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
128f0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
12900 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
12910 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
12920 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
12930 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
12940 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
12950 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
12960 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12970 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
12980 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
12990 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
129a0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
129b0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
129c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
129d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
129e0 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
129f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12a00 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12a10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12a20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
12a30 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
12a40 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
12a50 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
12a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12a70 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
12a80 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
12a90 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
12aa0 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
12ab0 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
12ac0 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
12ad0 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
12ae0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
12af0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
12b00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12b10 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
12b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12b30 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
12b40 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
12b50 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
12b60 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
12b70 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
12b80 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
12b90 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
12ba0 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
12bb0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12bc0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
12bd0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
12be0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
12bf0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
12c00 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
12c10 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12c20 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
12c30 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
12c40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12c50 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12c60 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12c70 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12c80 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12c90 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12ca0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12cb0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12cd0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12ce0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12cf0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12d00 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12d10 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12d20 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12d30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12d40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12d50 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
12d60 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12d70 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
12d80 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12d90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12da0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
12db0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
12dc0 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
12dd0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
12de0 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
12df0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12e00 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12e10 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
12e20 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
12e30 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65  ck,..   pFile->e
12e40 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12e50 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12e60 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12e70 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12e80 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12e90 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12ea0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12eb0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ed0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
12ee0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
12ef0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
12f00 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
12f10 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12f20 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12f30 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12f40 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12f50 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12f70 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12f80 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
12f90 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
12fa0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
12fb0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
12fc0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12fe0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12ff0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13000 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
13010 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
13020 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
13030 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13040 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
13050 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13060 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
13070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
13080 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
13090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
130a0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
130b0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
130c0 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74  t semClose(sqlit
130d0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
130e0 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
130f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13100 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13110 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64      semUnlock(id
13120 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
13130 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13140 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
13150 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61  tex();.    relea
13160 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
13170 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
13180 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
13190 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
131a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
131b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
131c0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
131d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
131e0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
131f0 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
13200 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
13210 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13220 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
13230 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
13240 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13250 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132b0 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
132c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
13310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13320 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
13330 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13350 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
13360 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
13370 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
13380 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
13390 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
133a0 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
133b0 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
133c0 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
133d0 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
133e0 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
133f0 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
13400 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
13410 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
13420 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
13430 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
13440 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
13450 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
13460 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
13470 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
13480 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
13490 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
134a0 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
134b0 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
134c0 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
134d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
134e0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
134f0 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
13500 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
13510 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
13520 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
13530 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
13540 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
13550 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
13560 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
13570 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
13580 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
13590 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
135a0 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
135b0 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
135c0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
135d0 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
135e0 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
135f0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
13600 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
13610 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
13620 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
13630 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
13640 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
13650 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
13660 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
13670 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
13680 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
13690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
136a0 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
136b0 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
136c0 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
136d0 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
136e0 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
13710 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
13720 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
13730 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
13740 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
13750 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
13760 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
13770 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
13780 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
13790 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
137a0 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
137b0 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
137c0 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
137d0 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
137e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
137f0 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
13800 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
13810 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13820 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
13830 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13850 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
13860 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
13870 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
13880 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
138a0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
138b0 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
138c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
138d0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
138e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
138f0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
13900 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13910 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
13920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
13930 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
13940 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
13950 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
13960 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
13970 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
13980 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
13990 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
139a0 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
139b0 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
139c0 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
139d0 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
139e0 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
139f0 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
13a00 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
13a10 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
13a20 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
13a30 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
13a40 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
13a50 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
13a60 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
13a70 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
13a80 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
13a90 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
13aa0 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
13ab0 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13ac0 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13ad0 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
13ae0 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
13af0 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
13b00 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
13b10 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
13b20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13b30 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13b40 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
13b50 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
13b60 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
13b70 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
13b90 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
13ba0 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
13bb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13bc0 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
13bd0 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
13be0 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
13bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13c00 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13c10 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13c30 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
13c40 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
13c50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
13c60 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
13c70 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
13c80 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
13c90 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
13ca0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
13cb0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
13cc0 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13cd0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13ce0 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
13cf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13d00 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
13d10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13d20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
13d30 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
13d40 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
13d50 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
13d60 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
13d70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
13d80 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
13d90 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
13da0 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
13db0 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
13dc0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
13dd0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
13de0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
13df0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
13e00 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
13e10 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
13e20 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
13e30 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
13e40 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
13e50 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
13e60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13e70 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
13e80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13e90 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13ea0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13eb0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13ec0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
13ed0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
13ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13ef0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13f00 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
13f10 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13f20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13f30 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
13f40 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13f50 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
13f60 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
13f70 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
13f80 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
13f90 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
13fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13fb0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
13fc0 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
13fd0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
13fe0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
13ff0 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
14000 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
14010 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
14020 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
14030 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
14040 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
14050 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
14060 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
14070 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
14080 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
14090 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
140a0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
140b0 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
140c0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
140d0 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
140e0 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
140f0 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
14100 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
14110 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
14120 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
14130 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
14140 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
14150 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
14160 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
14170 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
14180 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
14190 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
141a0 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
141b0 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
141c0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
141d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
141e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
141f0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
14200 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14210 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
14220 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
14230 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
14240 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
14250 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
14260 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
14270 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14280 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
14290 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
142a0 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
142b0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
142c0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
142d0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
142e0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
142f0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14300 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
14310 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
14320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14330 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
14340 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
14350 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
14360 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
14370 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
14380 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
14390 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
143a0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
143b0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
143c0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
143d0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
143e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
143f0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
14400 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
14410 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
14420 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
14430 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
14440 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
14450 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
14460 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
14470 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
14480 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
14490 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
144a0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
144b0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
144c0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
144d0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
144e0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
144f0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
14500 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
14510 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
14520 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
14530 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
14540 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
14550 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
14560 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
14570 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14580 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14590 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
145a0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
145b0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
145c0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
145d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
145e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
145f0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
14600 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
14610 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
14620 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
14630 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
14640 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
14650 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
14660 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14670 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
14680 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
14690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
146a0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
146b0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
146c0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
146d0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
146e0 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
146f0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
14700 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
14710 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
14720 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
14730 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
14740 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
14750 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
14760 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
14770 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
14780 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
14790 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
147a0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
147b0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
147c0 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
147d0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
147e0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
147f0 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
14800 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
14810 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
14820 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
14830 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
14840 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
14850 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
14860 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
14870 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
14880 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
14890 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
148a0 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
148b0 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
148c0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
148d0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
148e0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
148f0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
14900 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
14910 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
14920 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
14930 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
14940 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
14950 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
14960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14970 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
14980 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
14990 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
149a0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
149b0 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
149c0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
149d0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
149e0 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
149f0 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
14a00 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
14a10 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
14a20 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
14a30 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
14a40 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
14a50 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
14a60 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
14a70 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
14a80 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
14a90 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
14aa0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
14ab0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
14ac0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
14ad0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
14ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
14af0 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
14b00 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
14b10 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
14b20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
14b30 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
14b40 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
14b50 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
14b60 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14b70 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
14b80 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14b90 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
14ba0 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
14bb0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
14bc0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
14bd0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
14be0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
14bf0 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
14c00 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
14c10 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
14c20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
14c30 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
14c40 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
14c50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
14c60 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
14c70 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
14c80 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
14c90 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
14ca0 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
14cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
14cc0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
14cd0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
14ce0 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
14cf0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
14d00 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
14d10 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
14d20 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
14d30 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
14d40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
14d50 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
14d60 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
14d70 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
14d80 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
14d90 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
14da0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
14db0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
14dc0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
14dd0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
14de0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
14df0 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
14e00 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
14e10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
14e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14e30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14e40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
14e50 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
14e60 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
14e70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
14e80 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
14e90 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
14ea0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
14eb0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
14ec0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
14ed0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
14ee0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
14ef0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
14f00 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
14f10 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
14f20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
14f30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
14f40 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
14f50 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
14f60 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
14f70 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
14f80 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
14f90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
14fa0 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
14fb0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
14fc0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
14fd0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
14fe0 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
14ff0 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
15000 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
15010 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
15020 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
15030 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
15040 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
15050 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
15060 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15070 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15080 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
15090 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
150a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
150b0 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
150c0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
150d0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
150e0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
150f0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
15100 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
15110 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15120 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
15130 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
15140 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c  no;.    long lk,
15150 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
15160 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
15170 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
15180 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
15190 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
151a0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
151b0 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
151c0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
151d0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
151e0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
151f0 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
15200 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
15210 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
15220 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
15230 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
15240 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
15250 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
15260 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
15270 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
15280 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
15290 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
152a0 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
152b0 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
152c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
152d0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
152e0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
152f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
15300 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
15310 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15320 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
15330 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
15340 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
15350 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
15360 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
15370 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
15380 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
15390 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
153a0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
153b0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
153c0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
153d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
153e0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
153f0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
15400 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
15410 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
15420 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15430 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
15440 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15450 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
15460 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
15470 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15480 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
15490 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
154a0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
154b0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
154c0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
154d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
154e0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
154f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
15500 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
15510 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
15520 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15530 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
15540 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
15550 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
15560 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
15570 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
15580 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
15590 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
155a0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
155b0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
155c0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
155d0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
155e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
155f0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
15600 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
15610 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
15620 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
15630 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
15640 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
15650 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
15660 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
15670 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
15680 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
15690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
156a0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
156b0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
156c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
156d0 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
156e0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
156f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
15700 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
15710 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
15720 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
15730 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
15740 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
15750 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15760 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15770 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15780 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
15790 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
157a0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
157b0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
157c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
157d0 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
157e0 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
157f0 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
15800 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
15810 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
15820 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
15830 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
15840 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
15850 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
15860 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
15870 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
15880 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
15890 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
158a0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
158b0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
158c0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
158d0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
158e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
158f0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
15900 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
15930 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
15940 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
15950 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
15960 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
15970 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
15980 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
15990 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
159a0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
159b0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
159c0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
159d0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
15a00 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
15a10 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
15a20 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
15a30 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15a40 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15a50 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15a60 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15a70 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
15a80 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
15a90 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
15aa0 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
15ab0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
15ac0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
15ad0 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
15ae0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
15af0 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
15b00 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
15b10 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
15b20 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
15b30 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
15b40 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
15b50 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
15b60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
15b70 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
15b80 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
15b90 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
15ba0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
15bb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
15bc0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
15bd0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
15be0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
15bf0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
15c00 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
15c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15c20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15c30 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15c40 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
15c50 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
15c60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
15c70 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
15c80 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
15c90 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
15ca0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
15cb0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
15cc0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
15cd0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
15ce0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
15cf0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15d00 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
15d10 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
15d20 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
15d30 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
15d40 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
15d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
15d60 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
15d70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15d80 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
15d90 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
15da0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
15db0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
15dc0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
15dd0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
15de0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
15df0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
15e00 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
15e10 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
15e20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
15e30 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
15e40 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
15e50 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
15e60 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
15e70 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15e80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
15e90 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15ea0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15eb0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
15ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15ed0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15ee0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15ef0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
15f00 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
15f10 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15f20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
15f30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
15f40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
15f50 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
15f60 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
15f70 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
15f80 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
15f90 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
15fa0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15fb0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
15fc0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
15fd0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
15fe0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15ff0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
16000 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16010 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
16020 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
16030 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
16040 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
16050 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
16060 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
16070 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
16080 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
16090 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
160a0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
160b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
160c0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
160d0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
160e0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
160f0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
16100 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
16110 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
16120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
16130 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
16140 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16150 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
16160 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
16170 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16180 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
16190 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
161a0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
161b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
161c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
161d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
161e0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
161f0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
16200 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
16210 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
16220 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
16230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
16240 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
16250 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
16260 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16270 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
16280 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
16290 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
162a0 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
162b0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
162c0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
162d0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
162e0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
162f0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
16300 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
16310 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
16320 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
16330 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
16340 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
16350 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
16360 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
16370 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
16380 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
16390 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
163a0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
163b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
163c0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
163d0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
163e0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
163f0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
16400 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
16410 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
16420 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
16430 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
16440 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
16450 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16460 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16470 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
16480 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16490 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
164a0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
164b0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
164c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
164d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
164e0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
164f0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
16500 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
16510 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
16520 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
16530 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
16540 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
16550 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
16560 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
16570 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
16580 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
16590 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
165a0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
165b0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
165c0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
165d0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
165e0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
165f0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
16600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
16610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
16620 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
16630 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
16640 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
16650 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16660 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16670 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
16680 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
16690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
166a0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
166b0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
166c0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
166d0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
166e0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
166f0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16700 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16710 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
16720 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
16730 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
16740 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
16750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16760 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16770 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
16780 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
16790 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
167a0 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
167b0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
167c0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
167d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
167e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
167f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
16800 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
16810 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
16820 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
16830 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
16840 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
16850 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
16860 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
16870 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
16880 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
16890 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
168a0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
168b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
168c0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
168d0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
168e0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
168f0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
16900 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
16910 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
16920 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
16930 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16940 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
16950 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
16960 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
16970 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16980 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
16990 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
169a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
169b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
169c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
169d0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
169e0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
169f0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
16a00 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
16a10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
16a20 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
16a30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a40 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16a60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16a70 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
16a80 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
16a90 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16aa0 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
16ab0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
16ac0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
16ad0 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
16ae0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
16af0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
16b00 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16b10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16b20 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
16b30 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16b40 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
16b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
16b60 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
16b70 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
16b80 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
16b90 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
16ba0 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
16bb0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
16bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16bd0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
16be0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
16bf0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16c00 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
16c10 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
16c20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
16c30 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
16c40 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
16c50 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
16c60 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
16c70 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
16c80 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
16c90 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
16ca0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
16cb0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
16cc0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
16cd0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
16ce0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
16cf0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
16d00 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
16d10 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
16d20 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
16d30 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
16d40 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
16d50 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
16d60 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
16d70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
16d80 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
16d90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
16da0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
16db0 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
16dc0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
16dd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
16de0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
16df0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
16e00 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
16e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16e20 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
16e30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
16e40 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16e50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
16e60 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
16e70 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
16e80 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
16e90 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
16ea0 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
16eb0 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
16ec0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
16ed0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
16ee0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
16ef0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
16f00 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
16f10 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
16f20 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
16f30 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
16f40 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
16f50 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
16f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
16f70 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
16f80 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
16f90 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
16fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
16fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ff0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
17000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17060 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
17070 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
17080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
170a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
170b0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
170c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
170d0 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
170e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
170f0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17100 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17110 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17120 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
17130 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17140 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
17150 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
17160 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
17170 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17180 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
17190 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
171a0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
171b0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
171c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
171d0 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
171e0 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
171f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17200 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
17210 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
17220 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
17230 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
17240 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17250 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17270 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
17280 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
17290 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
172a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
172b0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
172c0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
172d0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
172e0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
172f0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17300 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17310 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
17320 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17330 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
17340 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
17350 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
17360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17370 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
173c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
173d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17410 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17420 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
17430 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
17440 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
17450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17460 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
17470 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
17480 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
17490 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
174a0 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
174b0 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
174c0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
174d0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
174e0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
174f0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
17500 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
17510 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
17520 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
17530 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
17540 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
17550 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
17560 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
17570 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
17580 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
17590 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
175a0 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
175b0 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
175c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
175d0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
175e0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
175f0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
17600 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17610 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
17620 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
17630 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
17640 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
17650 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
17660 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
17670 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
17680 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
17690 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
176a0 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
176b0 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
176c0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
176d0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
176e0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
176f0 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
17700 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
17710 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
17720 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
17730 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
17740 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
17750 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
17760 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
17770 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
17780 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
17790 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
177a0 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
177b0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
177c0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
177d0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
177e0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
177f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
17800 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
17810 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
17820 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69   got;.#if (!defi
17830 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
17840 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
17850 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
17860 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
17870 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
17880 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
17890 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74  PREAD).  do{ got
178a0 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68   = osPread(id->h
178b0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
178c0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
178d0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
178e0 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  NTR );.  Simulat
178f0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
17900 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
17910 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
17920 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
17930 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
17940 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
17950 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
17960 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
17970 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
17980 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
17990 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
179a0 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
179b0 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
179c0 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ET);.  SimulateI
179d0 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
179e0 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  t-- );.  if( new
179f0 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29  Offset!=offset )
17a00 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  {.    if( newOff
17a10 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  set == -1 ){.   
17a20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
17a30 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
17a40 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  errno;.    }else
17a50 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
17a60 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
17a70 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d  no = 0;....    }
17a80 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
17a90 20 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20    }.  do{ got = 
17aa0 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  osRead(id->h, pB
17ab0 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65  uf, cnt); }while
17ac0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
17ad0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
17ae0 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
17af0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
17b00 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17b10 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17b20 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  rrno;.  }.  OSTR
17b30 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
17b40 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
17b50 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
17b60 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
17b70 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
17b80 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn got;.}../*.*
17b90 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
17ba0 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
17bb0 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
17bc0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
17bd0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
17be0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
17bf0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
17c00 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
17c10 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
17c20 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
17c30 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
17c40 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
17c50 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
17c60 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
17c70 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
17c80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17c90 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
17ca0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
17cb0 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f  sert( id );..  /
17cc0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
17cd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
17ce0 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
17cf0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
17d00 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
17d10 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
17d20 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
17d30 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
17d40 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
17d50 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
17d60 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
17d70 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
17d80 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
17d90 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
17da0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
17db0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
17dc0 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
17dd0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
17de0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
17df0 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
17e00 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
17e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17e20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
17e30 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
17e40 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
17e50 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
17e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17e70 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
17e80 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
17e90 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
17ea0 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
17eb0 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
17ec0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
17ed0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
17ee0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
17ef0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
17f00 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
17f10 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
17f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17f30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
17f40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65    }.}../*.** See
17f50 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
17f60 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
17f70 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
17f80 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
17f90 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
17fa0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
17fb0 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
17fc0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
17fd0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
17fe0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
17ff0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
18000 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
18010 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
18020 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
18030 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
18040 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
18050 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
18060 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
18070 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
18080 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
18090 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
180a0 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
180b0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
180c0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
180d0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
180e0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
180f0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18100 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
18110 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c   osPwrite(id->h,
18120 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
18130 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  et); }while( got
18140 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18150 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
18160 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18170 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
18180 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
18190 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
181a0 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  );}while( got<0 
181b0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
181c0 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
181d0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
181e0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
181f0 53 45 54 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  SET);.  if( newO
18200 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
18210 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
18220 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
18230 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18240 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18250 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
18260 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
18270 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
18280 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
18290 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
182a0 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f   }.  do{ got = o
182b0 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
182c0 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65  uf, cnt); }while
182d0 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
182e0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
182f0 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
18300 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18310 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18320 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18330 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rrno;.  }..  OST
18340 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
18350 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
18360 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
18370 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
18380 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
18390 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
183a0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
183b0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
183c0 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
183d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
183e0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
183f0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
18400 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
18410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18420 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
18430 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
18440 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
18450 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
18460 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
18470 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
18480 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18490 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
184a0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
184b0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
184c0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
184d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
184e0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
184f0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
18500 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
18510 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
18520 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
18530 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
18540 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
18550 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
18560 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
18570 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
18580 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
18590 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
185a0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
185b0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
185c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
185d0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   );.#endif..#ifn
185e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
185f0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
18600 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
18610 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
18620 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
18630 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f  .  ** doing a ho
18640 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
18650 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
18660 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
18670 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72   than a.  ** nor
18680 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
18690 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74  e) then record t
186a0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
186b0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68   database.  ** h
186c0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  as changed.  If 
186d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
186e0 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66  counter is modif
186f0 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74  ied, record that
18700 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a  .  ** fact too..
18710 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
18720 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
18730 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  ){.    pFile->db
18740 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20  Update = 1;  /* 
18750 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  The database has
18760 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a   been modified *
18770 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
18780 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61  <=24 && offset+a
18790 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20  mt>=27 ){.      
187a0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
187b0 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20  ar oldCntr[4];. 
187c0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
187d0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
187e0 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e       rc = seekAn
187f0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c  dRead(pFile, 24,
18800 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20   oldCntr, 4);.  
18810 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18820 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
18830 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c      if( rc!=4 ||
18840 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c   memcmp(oldCntr,
18850 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
18860 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d  24-offset], 4)!=
18870 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
18880 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
18890 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74  g = 1;  /* The t
188a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
188b0 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a  er has changed *
188c0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
188d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
188e0 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
188f0 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
18900 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
18910 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
18920 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
18930 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
18940 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
18950 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
18960 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
18970 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
18980 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
18990 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
189a0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
189b0 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
189c0 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
189d0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  mt>0 ){.    if( 
189e0 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  wrote<0 ){.     
189f0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
18a00 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
18a10 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
18a20 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
18a30 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
18a40 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
18a50 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
18a60 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
18a70 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
18a80 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
18a90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
18aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18ab0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18ac0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
18ad0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
18ae0 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
18af0 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
18b00 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
18b10 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
18b20 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
18b30 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
18b40 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
18b50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
18b60 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
18b70 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
18b80 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
18b90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
18ba0 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
18bb0 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
18bc0 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
18bd0 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
18be0 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
18bf0 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
18c00 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
18c10 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73   the (slower) fs
18c20 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75  ync()..** If you
18c30 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
18c40 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
18c50 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
18c60 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
18c70 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
18c80 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
18c90 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a  nc=fdatasync.*/.
18ca0 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61  #if !defined(fda
18cb0 74 61 73 79 6e 63 29 20 26 26 20 21 64 65 66 69  tasync) && !defi
18cc0 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
18cd0 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
18ce0 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
18cf0 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
18d00 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
18d10 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
18d20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
18d30 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
18d40 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
18d50 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
18d60 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
18d70 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
18d80 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
18d90 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
18da0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
18db0 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
18dc0 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
18dd0 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
18de0 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
18df0 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
18e00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
18e10 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
18e20 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
18e30 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
18e40 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
18e50 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
18e60 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
18e70 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
18e80 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
18e90 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
18ea0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
18eb0 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
18ec0 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
18ed0 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
18ee0 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
18ef0 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
18f00 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
18f10 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
18f20 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
18f30 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
18f40 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
18f50 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
18f60 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
18f70 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
18f80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
18f90 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
18fa0 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
18fb0 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
18fc0 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
18fd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
18fe0 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
18ff0 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
19000 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
19010 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
19020 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
19030 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
19040 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
19050 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
19060 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
19070 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
19080 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
19090 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
190a0 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
190b0 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
190c0 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
190d0 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
190e0 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
190f0 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
19100 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
19110 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19120 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
19130 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
19140 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
19150 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
19160 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
19170 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
19180 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
19190 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
191a0 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
191b0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
191c0 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
191d0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
191e0 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
191f0 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
19200 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
19210 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
19220 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
19230 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
19240 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
19250 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
19260 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
19270 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
19280 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
19290 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
192a0 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
192b0 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
192c0 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
192d0 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
192e0 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
192f0 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
19300 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
19310 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
19320 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
19330 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
19340 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
19350 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
19360 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
19370 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
19380 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
19390 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
193a0 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
193b0 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
193c0 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
193d0 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
193e0 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
193f0 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
19400 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
19410 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
19420 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
19430 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19440 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
19450 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
19460 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
19470 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19480 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
19490 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
194a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
194b0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
194c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
194d0 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
194e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
194f0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
19500 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
19510 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
19520 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
19530 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
19540 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
19550 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
19560 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
19570 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
19580 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
19590 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
195a0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
195b0 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
195c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
195d0 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
195e0 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
195f0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
19600 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19610 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
19620 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
19630 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
19640 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
19650 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
19660 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
19670 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
19680 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
19690 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
196a0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
196b0 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
196c0 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
196d0 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
196e0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
196f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
19700 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
19710 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
19720 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
19730 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
19740 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
19750 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
19760 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
19770 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
19780 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
19790 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
197a0 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
197b0 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
197c0 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
197d0 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
197e0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
197f0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
19800 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
19810 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
19820 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
19830 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
19840 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
19850 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
19860 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
19870 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
19880 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
19890 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
198a0 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
198b0 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
198c0 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
198d0 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
198e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
198f0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
19900 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
19910 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
19920 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
19930 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
19940 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
19950 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
19960 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
19970 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
19980 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
19990 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
199a0 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
199b0 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
199c0 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
199d0 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
199e0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
199f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
19a00 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
19a10 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
19a20 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
19a30 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
19a40 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
19a50 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
19a60 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
19a70 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
19a80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
19a90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19aa0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
19ab0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
19ac0 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
19ad0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
19ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
19af0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
19b00 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
19b10 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
19b20 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
19b30 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
19b40 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
19b50 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
19b60 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
19b70 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
19b80 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
19b90 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
19ba0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
19bb0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
19bc0 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
19bd0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
19be0 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
19bf0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
19c00 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
19c10 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
19c20 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
19c30 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
19c40 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
19c50 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
19c60 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
19c70 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
19c80 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
19c90 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
19ca0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
19cb0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
19cc0 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
19cd0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
19ce0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
19cf0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
19d00 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
19d10 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
19d20 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
19d30 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
19d40 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
19d50 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
19d60 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
19d70 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
19d80 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
19d90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19da0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
19db0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
19dc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19dd0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
19de0 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
19df0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
19e00 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
19e10 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
19e20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
19e30 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
19e40 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
19e50 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
19e60 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
19e70 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
19e80 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
19e90 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
19ea0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
19eb0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
19ec0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
19ed0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
19ee0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
19ef0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
19f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
19f10 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
19f20 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
19f30 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
19f40 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
19f50 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
19f60 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
19f70 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
19f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19f90 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
19fa0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
19fb0 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
19fc0 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
19fd0 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
19fe0 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
19ff0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1a000 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1a010 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1a020 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1a030 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a040 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a050 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1a060 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1a070 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1a080 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1a090 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Path);.  }.  if(
1a0a0 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
1a0b0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1a0c0 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
1a0d0 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1a0e0 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1a0f0 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
1a100 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1a110 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1a120 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64  ullsync));.#ifnd
1a130 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1a140 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
1a150 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
1a160 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
1a170 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
1a180 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
1a190 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
1a1a0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
1a1b0 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
1a1c0 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
1a1d0 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
1a1e0 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
1a1f0 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
1a200 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
1a210 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
1a220 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
1a230 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
1a240 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
1a250 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
1a260 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
1a270 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
1a280 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
1a290 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
1a2a0 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
1a2b0 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
1a2c0 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
1a2d0 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
1a2e0 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
1a2f0 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1a300 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
1a310 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
1a320 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
1a330 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
1a340 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
1a350 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
1a360 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61      /* pFile->la
1a370 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1a380 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
1a390 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a3a0 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
1a3b0 69 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e  if.    /* Only n
1a3c0 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
1a3d0 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20  , so close the  
1a3e0 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77  directory when w
1a3f0 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20  e are done */.  
1a400 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1a410 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72  File, pFile->dir
1a420 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1a430 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
1a440 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1a450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a460 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1a470 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1a480 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1a490 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1a4a0 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1a4b0 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1a4c0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1a4d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1a4e0 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
1a4f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1a500 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
1a510 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1a520 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1a530 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
1a540 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
1a550 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
1a560 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
1a570 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
1a580 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
1a590 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
1a5a0 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
1a5b0 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
1a5c0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
1a5d0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
1a5e0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
1a5f0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
1a600 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1a610 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
1a620 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1a630 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
1a640 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
1a650 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
1a660 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
1a670 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1a680 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
1a690 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
1a6a0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28  cate(pFile->h, (
1a6b0 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
1a6c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
1a6d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1a6e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1a6f0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1a700 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1a710 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1a720 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1a730 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  );.  }else{.#ifn
1a740 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
1a750 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1a760 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1a770 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1a780 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1a790 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1a7a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1a7b0 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1a7c0 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1a7d0 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1a7e0 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1a7f0 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1a800 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1a810 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1a820 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1a830 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1a840 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1a850 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1a860 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1a870 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1a880 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1a890 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1a8a0 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1a8b0 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1a8c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a8d0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1a8e0 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1a8f0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1a900 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1a910 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1a920 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
1a930 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1a940 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1a950 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1a960 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1a970 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1a980 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1a990 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a9a0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1a9b0 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1a9c0 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1a9d0 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1a9e0 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
1a9f0 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
1aa00 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
1aa10 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1aa20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1aa30 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1aa40 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1aa50 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1aa60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1aa70 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1aa80 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1aa90 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1aaa0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1aab0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1aac0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1aad0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1aae0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1aaf0 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1ab00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1ab10 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1ab20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1ab30 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1ab40 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1ab50 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1ab60 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1ab70 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1ab80 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1ab90 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1aba0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1abb0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1abc0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1abd0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1abe0 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1abf0 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1ac00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1ac10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1ac20 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1ac30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ac40 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1ac50 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1ac60 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1ac70 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1ac80 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1ac90 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1aca0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1acb0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1acc0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1acd0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1ace0 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1acf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ad00 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1ad10 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1ad20 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1ad30 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1ad40 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
1ad50 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1ad60 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1ad70 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1ad80 73 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64  s file, it could
1ad90 20 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20   be.** that the 
1ada0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1adb0 20 65 78 74 65 6e 64 65 64 20 61 74 20 74 68 69   extended at thi
1adc0 73 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69  s point. Otherwi
1add0 73 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54  se, the.** SQLIT
1ade0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1adf0 54 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  T operation is a
1ae00 20 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e   no-op for Unix.
1ae10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ae20 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1ae30 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1ae40 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1ae50 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29  pFile->szChunk )
1ae60 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1ae90 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1aea0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1aeb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1aec0 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1aed0 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1aee0 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1aef0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1af00 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1af10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1af20 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1af30 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1af40 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1af50 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1af60 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1af70 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1af80 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1af90 5f 73 69 7a 65 20 29 7b 0a 23 69 66 20 64 65 66  _size ){.#if def
1afa0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1afb0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1afc0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1afd0 54 45 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  TE.      int rc;
1afe0 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1aff0 20 20 20 72 63 20 3d 20 6f 73 46 61 6c 6c 6f 63     rc = osFalloc
1b000 61 74 65 28 70 46 69 6c 65 2d 3e 2e 68 2c 20 62  ate(pFile->.h, b
1b010 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1b020 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20  e-buf.st_size;. 
1b030 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c       }while( rc<
1b040 30 20 26 26 20 65 72 72 6e 6f 3d 45 49 4e 54 52  0 && errno=EINTR
1b050 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
1b060 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b070 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1b080 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1b090 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1b0a0 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1b0b0 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1b0c0 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1b0d0 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1b0e0 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1b0f0 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1b100 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1b110 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1b120 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1b130 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1b140 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1b150 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1b160 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1b170 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1b180 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1b190 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1b1a0 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1b1b0 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1b1c0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1b1d0 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1b1e0 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1b1f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1b200 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1b210 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1b220 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1b230 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1b240 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b250 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1b260 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1b270 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1b280 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b290 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1b2a0 75 65 20 66 72 6f 6d 20 73 65 65 6b 41 6e 64 57  ue from seekAndW
1b2b0 72 69 74 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  rite() */..     
1b2c0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1b2d0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1b2e0 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  nSize) ){.      
1b2f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1b300 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1b310 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1b320 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b330 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1b340 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1b350 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1b360 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20   }.      iWrite 
1b370 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1b380 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1b390 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1b3a0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 6e    do {.        n
1b3b0 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1b3c0 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1b3d0 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1b3e0 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
1b3f0 6c 6b 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c  lk;.      } whil
1b400 65 28 20 6e 57 72 69 74 65 3d 3d 31 20 26 26 20  e( nWrite==1 && 
1b410 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 3b 0a  iWrite<nSize );.
1b420 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1b430 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1b440 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1b450 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1b460 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b470 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b480 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1b490 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1b4a0 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1b4b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b4c0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1b4d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b4e0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1b4f0 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
1b500 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1b510 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1b520 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1b530 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1b540 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65 46 69  ixFile*)id)->eFi
1b550 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1b560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b570 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1b580 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
1b590 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1b5a0 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
1b5b0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
1b5c0 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
1b5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b5e0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b5f0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1b600 5a 45 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ZE: {.      ((un
1b610 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 73 7a 43  ixFile*)id)->szC
1b620 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1b630 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1b640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b650 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1b660 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1b670 4e 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  NT: {.      retu
1b680 72 6e 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  rn fcntlSizeHint
1b690 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 2c  ((unixFile *)id,
1b6a0 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1b6b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1b6c0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20  EBUG.    /* The 
1b6d0 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73  pager calls this
1b6e0 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61   method to signa
1b6f0 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f  l that it has do
1b700 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c  ne.    ** a roll
1b710 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1b720 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  e database is th
1b730 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65  erefore unchange
1b740 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20  d and.    ** it 
1b750 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66  hence it is OK f
1b760 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  or the transacti
1b770 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  on change counte
1b780 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  r to be.    ** u
1b790 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f  nchanged..    */
1b7a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b7b0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1b7c0 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75  GED: {.      ((u
1b7d0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62  nixFile*)id)->db
1b7e0 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
1b7f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b800 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1b810 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1b820 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1b830 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1b840 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
1b850 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
1b860 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1b870 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
1b880 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
1b890 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78       return prox
1b8a0 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c  yFileControl(id,
1b8b0 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  op,pArg);.    }.
1b8c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b8d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1b8e0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1b8f0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
1b900 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b910 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45  CNTL_SYNC_OMITTE
1b920 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  D: {.      retur
1b930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
1b940 20 41 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20   A no-op */.    
1b950 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1b960 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1b970 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b980 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1b990 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
1b9a0 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
1b9b0 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
1b9c0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1b9d0 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
1b9e0 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
1b9f0 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
1ba00 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
1ba10 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
1ba20 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
1ba30 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
1ba40 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
1ba50 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
1ba60 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
1ba70 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
1ba80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
1ba90 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
1baa0 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
1bab0 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
1bac0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
1bad0 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
1bae0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
1baf0 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
1bb00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1bb10 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1bb20 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1bb30 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1bb40 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1bb50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1bb60 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1bb70 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
1bb80 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
1bb90 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1bba0 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 20  s for the file. 
1bbb0 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 30  This is always 0
1bbc0 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74   for unix..*/.st
1bbd0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
1bbe0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1bbf0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1bc00 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
1bc10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1bc20 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
1bc30 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
1bc40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
1bc50 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
1bc60 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1bc70 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
1bc80 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
1bc90 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
1bca0 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
1bcb0 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
1bcc0 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
1bcd0 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
1bce0 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
1bcf0 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
1bd00 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
1bd10 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
1bd20 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
1bd30 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
1bd40 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
1bd50 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
1bd60 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
1bd70 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
1bd80 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
1bd90 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1bda0 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
1bdb0 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
1bdc0 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
1bdd0 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
1bde0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
1bdf0 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
1be00 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
1be10 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
1be20 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
1be30 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
1be40 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
1be50 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
1be60 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
1be70 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
1be80 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
1be90 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
1bea0 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
1beb0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
1bec0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1bed0 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
1bee0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
1bef0 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
1bf00 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1bf10 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
1bf20 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
1bf30 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
1bf40 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
1bf50 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
1bf60 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
1bf70 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
1bf80 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1bf90 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1bfa0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
1bfb0 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
1bfc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1bfd0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1bfe0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1bff0 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1c000 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
1c010 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
1c020 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
1c030 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
1c040 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
1c050 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
1c060 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
1c070 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
1c080 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
1c090 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
1c0a0 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
1c0b0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
1c0c0 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
1c0d0 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
1c0e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1c0f0 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
1c100 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
1c110 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
1c120 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1c130 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
1c140 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
1c150 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
1c160 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1c170 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
1c180 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
1c190 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
1c1a0 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1c1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1c1c0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1c1d0 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
1c1e0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1c1f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
1c200 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1c210 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
1c220 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1c230 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
1c240 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
1c250 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
1c260 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1c270 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
1c280 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1c290 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1c2a0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1c2b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c2c0 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
1c2d0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1c2e0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
1c2f0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1c300 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
1c310 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1c320 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
1c330 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c340 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
1c350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c360 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1c370 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1c380 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
1c390 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1c3a0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
1c3b0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
1c3c0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3e0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
1c3f0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
1c400 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1c410 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1c420 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1c430 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1c440 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1c450 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1c460 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1c470 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1c480 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1c490 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1c4a0 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1c4b0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1c4c0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1c4d0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1c4e0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
1c4f0 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
1c500 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1c510 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1c520 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1c530 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
1c540 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1c550 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1c560 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1c570 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1c580 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
1c590 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1c5a0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
1c5b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1c5c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1c5d0 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
1c5e0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1c5f0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
1c600 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1c610 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
1c620 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c640 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1c650 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1c660 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
1c670 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1c680 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1c690 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1c6a0 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1c6b0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1c6c0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1c6d0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1c6e0 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
1c6f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1c700 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
1c710 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
1c720 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1c730 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78   within its unix
1c740 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
1c750 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
1c760 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1c770 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1c780 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
1c790 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1c7a0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1c7b0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1c7c0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1c7d0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
1c7e0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
1c7f0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1c800 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
1c810 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
1c820 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
1c830 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1c840 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
1c850 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
1c860 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
1c870 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
1c880 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
1c890 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
1c8a0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
1c8b0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1c8c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1c8d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
1c8e0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1c8f0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
1c900 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
1c910 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1c920 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
1c930 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
1c940 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
1c950 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
1c960 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1c970 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1c980 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
1c990 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1c9a0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c9c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c9d0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
1c9e0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
1c9f0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
1ca00 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1ca10 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
1ca20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1ca30 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
1ca40 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
1ca50 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
1ca60 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
1ca70 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
1ca80 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1ca90 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1caa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cab0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
1cac0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
1cad0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1cae0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
1caf0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
1cb00 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
1cb10 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
1cb20 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
1cb30 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
1cb40 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
1cb50 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
1cb60 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1cb70 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
1cb80 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
1cb90 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
1cba0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1cbb0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1cbc0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1cbd0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
1cbe0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
1cbf0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
1cc00 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
1cc10 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
1cc20 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
1cc30 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
1cc40 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
1cc50 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
1cc60 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
1cc70 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
1cc80 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
1cc90 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
1cca0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
1ccb0 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
1ccc0 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
1ccd0 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
1cce0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1ccf0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
1cd00 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
1cd10 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
1cd20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
1cd30 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
1cd40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1cd50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1cd60 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
1cd70 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1cd80 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
1cd90 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1cda0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1cdb0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1cdc0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1cdd0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
1cde0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
1cdf0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1ce00 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1ce10 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1ce20 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1ce30 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1ce40 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1ce50 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1ce60 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1ce70 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
1ce80 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1ce90 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
1cea0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
1ceb0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
1cec0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1ced0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1cee0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
1cef0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
1cf00 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
1cf10 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1cf20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1cf30 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
1cf40 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1cf50 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
1cf60 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1cf70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1cf80 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1cf90 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1cfa0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
1cfb0 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
1cfc0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1cfd0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
1cfe0 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
1cff0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
1d000 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1d010 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
1d020 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
1d030 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
1d040 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
1d050 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1d060 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
1d070 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
1d080 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1d090 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
1d0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
1d0b0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
1d0c0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1d0d0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
1d0e0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1d0f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1d100 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1d110 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1d120 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1d130 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1d140 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1d150 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1d160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1d170 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
1d180 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
1d190 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
1d1a0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
1d1b0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
1d1c0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
1d1d0 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
1d1e0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1d1f0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
1d200 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
1d210 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
1d220 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
1d230 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1d240 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
1d250 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1d260 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
1d270 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30       if( p->h>=0
1d280 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e 6d   ){.        munm
1d290 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
1d2a0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
1d2b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1d2d0 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
1d2e0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1d2f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1d300 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
1d310 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
1d320 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
1d330 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
1d340 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1d350 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
1d360 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
1d370 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
1d380 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d390 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
1d3a0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
1d3b0 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1d3c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
1d3d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1d3e0 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
1d3f0 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
1d400 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
1d410 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
1d420 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
1d430 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
1d440 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
1d450 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
1d460 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
1d470 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1d480 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
1d490 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
1d4a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
1d4b0 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
1d4c0 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
1d4d0 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
1d4e0 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
1d4f0 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
1d500 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
1d510 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
1d520 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
1d530 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
1d540 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
1d550 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
1d560 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
1d570 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
1d580 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
1d590 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
1d5a0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
1d5b0 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
1d5c0 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
1d5d0 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
1d5e0 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
1d5f0 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
1d600 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
1d610 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d620 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
1d630 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
1d640 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
1d650 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
1d660 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
1d670 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
1d680 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
1d690 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
1d6a0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
1d6b0 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
1d6c0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
1d6d0 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
1d6e0 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
1d6f0 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
1d700 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
1d710 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
1d720 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1d730 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
1d740 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
1d750 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
1d760 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
1d770 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
1d780 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
1d790 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
1d7a0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
1d7b0 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
1d7c0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
1d7d0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
1d7e0 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
1d7f0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
1d800 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
1d810 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
1d820 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
1d830 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
1d840 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
1d850 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
1d860 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
1d870 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
1d880 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d890 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
1d8a0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
1d8b0 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
1d8c0 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
1d8d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1d8e0 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
1d8f0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
1d900 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
1d910 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
1d920 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
1d930 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
1d940 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
1d950 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1d960 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1d970 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1d980 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1d990 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1d9a0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1d9b0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1d9c0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1d9d0 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1d9e0 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1d9f0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1da00 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1da10 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1da20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  .**.** If the or
1da30 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1da40 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20  file (pDbFd) is 
1da50 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d  using the "unix-
1da60 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61  excl" VFS.** tha
1da70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  t means that an 
1da80 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1da90 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1daa0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a  tabase file and.
1dab0 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ** that no other
1dac0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61   processes are a
1dad0 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ble to read or w
1dae0 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
1daf0 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63  e.  In.** that c
1db00 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72  ase, we do not r
1db10 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65  eally need share
1db20 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68  d memory.  No sh
1db30 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  ared memory.** f
1db40 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ile is created. 
1db50 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
1db60 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c  ry will be simul
1db70 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d  ated with heap m
1db80 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
1db90 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61   int unixOpenSha
1dba0 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69  redMemory(unixFi
1dbb0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
1dbc0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
1dbd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1dbe0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1dbf0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1dc00 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
1dc10 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
1dc20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1dc30 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
1dc40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1dc70 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  code */.  unixIn
1dc80 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1dc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dca0 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a   inode of fd */.
1dcb0 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65    char *zShmFile
1dcc0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1dcd0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1dce0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
1dcf0 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
1dd00 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1dd10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1dd20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
1dd30 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
1dd40 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
1dd50 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
1dd60 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
1dd70 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
1dd80 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1dd90 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
1dda0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1ddb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
1ddc0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
1ddd0 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
1dde0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1ddf0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1de00 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
1de10 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
1de20 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
1de30 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
1de40 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
1de50 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
1de60 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
1de70 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  y..  */.  unixEn
1de80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
1de90 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
1dea0 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  node;.  pShmNode
1deb0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e   = pInode->pShmN
1dec0 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ode;.  if( pShmN
1ded0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
1dee0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f   /* fstat() info
1df10 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66 69   for database fi
1df20 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61  le */..    /* Ca
1df30 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
1df40 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
1df50 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
1df60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1df70 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
1df80 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
1df90 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
1dfa0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
1dfb0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
1dfc0 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
1dfd0 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 54 68 65  permissions. The
1dfe0 20 61 63 74 75 61 6c 20 70 65 72 6d 69 73 73 69   actual permissi
1dff0 6f 6e 73 20 74 68 65 20 66 69 6c 65 20 69 73 20  ons the file is 
1e000 63 72 65 61 74 65 64 0a 20 20 20 20 2a 2a 20 77  created.    ** w
1e010 69 74 68 20 61 72 65 20 73 75 62 6a 65 63 74 20  ith are subject 
1e020 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 75  to the current u
1e030 6d 61 73 6b 20 73 65 74 74 69 6e 67 2e 0a 20 20  mask setting..  
1e040 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
1e050 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
1e060 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
1e070 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
1e080 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e090 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e0a0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
1e0b0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1e0c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1e0d0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
1e0e0 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
1e0f0 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
1e100 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
1e110 2b 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 30;.#else.    
1e120 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35  nShmFilename = 5
1e130 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
1e140 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
1e150 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
1e160 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1e170 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
1e180 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
1e190 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
1e1a0 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
1e1b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e1c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1e1d0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1e1e0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
1e1f0 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
1e200 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1e210 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e  );.    zShmFilen
1e220 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ame = pShmNode->
1e230 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
1e240 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
1e250 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1e260 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
1e270 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1e280 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
1e290 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  zShmFilename, . 
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44      SQLITE_SHM_D
1e2c0 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74  IRECTORY "/sqlit
1e2d0 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20  e-shm-%x-%x",.  
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74     (u32)sStat.st
1e300 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74  _ino, (u32)sStat
1e310 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a  .st_dev);.#else.
1e320 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e330 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
1e340 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
1e350 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
1e360 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
1e370 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
1e380 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
1e390 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
1e3a0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
1e3b0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
1e3c0 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
1e3d0 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
1e3e0 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1e3f0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1e400 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1e410 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1e420 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1e430 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e440 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1e450 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1e460 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1e470 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
1e480 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
1e490 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
1e4a0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
1e4b0 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  mFilename, O_RDW
1e4c0 52 7c 4f 5f 43 52 45 41 54 2c 0a 20 20 20 20 20  R|O_CREAT,.     
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 20 20 20 20 20 28 73 53 74 61 74            (sStat
1e4f0 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 29  .st_mode & 0777)
1e500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
1e510 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
1e520 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
1e530 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1e540 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1e550 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
1e560 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
1e570 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1e580 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
1e590 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e5a0 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
1e5b0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
1e5c0 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
1e5d0 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ch..      ** If 
1e5e0 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
1e5f0 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1e600 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f  ength. .      */
1e610 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e620 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
1e630 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1e640 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
1e650 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
1e660 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1e670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1e680 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e690 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30  e(pShmNode->h, 0
1e6a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1e6b0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
1e6c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1e6d0 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74  MOPEN, "ftruncat
1e6e0 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  e", zShmFilename
1e6f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e700 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e720 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
1e730 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1e740 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b  ShmNode, F_RDLCK
1e750 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
1e760 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1e770 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1e780 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1e790 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
1e7a0 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
1e7b0 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
1e7c0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1e7d0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1e7e0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1e7f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e800 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
1e810 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
1e820 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
1e830 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
1e840 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
1e850 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
1e860 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
1e870 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
1e880 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
1e890 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1e8a0 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
1e8b0 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
1e8c0 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
1e8d0 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
1e8e0 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
1e8f0 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
1e900 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62  ruct unixShm) ob
1e910 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1e920 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1e930 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1e940 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1e950 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1e960 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1e970 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1e980 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1e990 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1e9a0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1e9b0 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1e9c0 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1e9d0 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78  utex .  ** mutex
1e9e0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e9f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1ea00 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1ea10 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
1ea20 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
1ea30 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1ea40 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
1ea50 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1ea60 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1ea70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ea80 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
1ea90 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
1eaa0 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
1eab0 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
1eac0 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20  DbFd);       /* 
1ead0 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
1eae0 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
1eaf0 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
1eb00 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69  3_free(p);.  uni
1eb10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1eb20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eb30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1eb40 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1eb50 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1eb60 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1eb70 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
1eb80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
1eb90 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1eba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
1ebb0 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
1ebc0 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
1ebd0 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
1ebe0 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
1ebf0 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
1ec00 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
1ec10 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
1ec20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
1ec30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1ec40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1ec50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ec60 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
1ec70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ec80 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e  e, if the bExten
1ec90 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
1eca0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1ecb0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1ecc0 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
1ecd0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1ece0 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
1ecf0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
1ed00 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
1ed10 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1ed20 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
1ed30 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
1ed40 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1ed50 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e  d. If .** bExten
1ed60 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  d is non-zero an
1ed70 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1ed80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1ed90 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
1eda0 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
1edb0 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
1edc0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
1edd0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1ede0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
1edf0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
1ee00 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
1ee10 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
1ee20 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
1ee30 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
1ee40 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
1ee50 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
1ee60 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
1ee70 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
1ee80 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1ee90 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
1eea0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1eeb0 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
1eec0 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
1eed0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
1eee0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1eef0 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
1ef00 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1ef10 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
1ef20 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62  le open on datab
1ef30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1ef40 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20  t iRegion,      
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef60 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69   Region to retri
1ef70 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  eve */.  int szR
1ef80 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
1ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1efa0 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20   of regions */. 
1efb0 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20   int bExtend,   
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65   /* True to exte
1efe0 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73  nd file if neces
1eff0 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76  sary */.  void v
1f000 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20  olatile **pp    
1f010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f020 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  : Mapped memory 
1f030 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
1f040 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
1f050 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53  ile*)fd;.  unixS
1f060 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d  hm *p;.  unixShm
1f070 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
1f080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f090 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
1f0a0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1f0b0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
1f0c0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
1f0d0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
1f0e0 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
1f0f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1f100 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1f110 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
1f120 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f130 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f140 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
1f150 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
1f160 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1f170 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1f180 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1f190 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1f1a0 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
1f1b0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1f1c0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1f1d0 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
1f1e0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1f1f0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
1f200 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
1f210 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
1f220 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
1f230 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
1f240 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
1f250 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
1f260 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
1f270 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
1f280 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1f290 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1f2a0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
1f2b0 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20  r **apNew;      
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b  /* New apRegion[
1f2e0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1f2f0 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1f300 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1f310 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1f320 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1f330 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1f340 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
1f350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f360 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a  d by fstat() */.
1f370 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1f380 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1f390 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  on;..    if( pSh
1f3a0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
1f3b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1f3c0 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
1f3d0 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
1f3e0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1f3f0 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
1f400 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1f410 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1f420 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1f430 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1f440 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1f450 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1f460 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1f470 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1f480 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  n)..      */.   
1f490 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1f4a0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74  ShmNode->h, &sSt
1f4b0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  at) ){.        r
1f4c0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1f4d0 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20  _SHMSIZE;.      
1f4e0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1f4f0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  ut;.      }.  . 
1f500 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73       if( sStat.s
1f510 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a  t_size<nByte ){.
1f520 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f530 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1f540 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
1f550 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
1f560 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
1f570 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78      ** false, ex
1f580 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
1f590 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
1f5a0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1f5b0 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
1f5c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1f5d0 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
1f5e0 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
1f5f0 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  e, use ftruncate
1f600 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
1f610 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
1f620 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1f630 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  egion..        *
1f640 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
1f650 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20 73 68  Extend ) goto sh
1f660 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1f670 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1f680 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
1f690 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1f6a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1f6b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1f6c0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1f6d0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20 20   "ftruncate",.  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1f700 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
1f710 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
1f720 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1f730 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1f750 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1f760 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1f770 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1f780 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1f790 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
1f7a0 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
1f7b0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1f7c0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
1f7d0 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
1f7e0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
1f7f0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1f800 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1f810 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1f820 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1f830 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1f840 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
1f850 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
1f860 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70  New;.    while(p
1f870 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f880 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20  <=iRegion){.    
1f890 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
1f8a0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1f8b0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1f8c0 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30 2c    pMem = mmap(0,
1f8d0 20 73 7a 52 65 67 69 6f 6e 2c 20 50 52 4f 54 5f   szRegion, PROT_
1f8e0 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
1f8f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
1f900 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
1f910 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64 65 2d  de->h, pShmNode-
1f920 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
1f930 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
1f940 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
1f950 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
1f960 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f970 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
1f980 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1f990 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
1f9a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f9b0 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
1f9c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
1f9d0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
1f9e0 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
1f9f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fa00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1fa10 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1fa20 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
1fa30 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1fa40 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
1fa50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fa60 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
1fa70 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1fa80 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
1fa90 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
1faa0 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
1fab0 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
1fac0 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
1fad0 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
1fae0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
1faf0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1fb00 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
1fb10 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1fb20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fb30 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1fb40 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1fb50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fb60 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1fb70 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1fb80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1fb90 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
1fba0 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
1fbb0 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
1fbc0 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
1fbd0 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
1fbe0 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
1fbf0 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
1fc00 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
1fc10 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
1fc20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
1fc30 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
1fc40 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
1fc50 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
1fc60 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
1fc70 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
1fc80 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
1fc90 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
1fca0 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
1fcb0 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
1fcc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1fcd0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1fce0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1fcf0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fd00 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1fd10 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1fd20 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd40 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1fd50 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1fd60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1fd90 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1fda0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1fdb0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1fdd0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1fde0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1fdf0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
1fe00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
1fe10 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1fe20 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1fe30 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
1fe40 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
1fe50 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1fe60 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1fe70 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1fe80 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
1fe90 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1fec0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1fed0 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
1fee0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1fef0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
1ff00 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1ff10 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
1ff20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ff30 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1ff40 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1ff50 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
1ff60 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1ff90 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
1ffa0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
1ffb0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
1ffc0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
1ffd0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
1ffe0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1fff0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
20000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
20010 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
20020 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
20030 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
20040 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
20050 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
20060 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
20070 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
20080 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
20090 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
200a0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
200b0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
200c0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
200d0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
200e0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
200f0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
20100 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
20110 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
20120 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
20130 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
20140 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
20150 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
20160 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20170 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
20180 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
20190 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
201a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
201b0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
201c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
201d0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
201e0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
201f0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
20200 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
20210 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
20220 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
20230 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20240 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20250 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
20260 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
20270 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
20280 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
20290 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
202a0 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
202b0 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
202c0 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
202d0 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
202e0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
202f0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
20300 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
20310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
20320 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
20330 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
20340 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
20350 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
20360 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
20370 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
20380 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
20390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
203a0 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
203b0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
203c0 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
203d0 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
203e0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
203f0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
20400 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
20410 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
20420 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
20430 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20440 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
20450 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
20460 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
20470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
20490 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
204a0 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
204b0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
204c0 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
204d0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
204e0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
204f0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
20500 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
20510 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
20520 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
20530 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
20540 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
20550 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
20560 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
20570 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
20580 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
20590 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
205a0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
205b0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
205c0 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
205d0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
205e0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
205f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
20600 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
20610 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
20620 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
20630 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
20640 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
20650 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
20660 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
20670 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20680 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
20690 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
206a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
206b0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
206c0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
206d0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
206e0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
206f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20700 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
20710 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
20720 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
20730 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
20740 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
20750 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
20760 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
20770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
20780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20790 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
207a0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
207b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
207c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
207d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
207e0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
207f0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
20800 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
20810 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
20820 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
20830 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
20840 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
20850 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
20860 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
20870 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
20880 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
20890 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
208a0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
208b0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
208c0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
208d0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
208e0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
208f0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
20900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20910 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
20920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20930 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
20940 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
20950 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
20960 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
20970 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
20980 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
20990 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
209a0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
209b0 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
209c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
209d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
209e0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
209f0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
20a00 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
20a10 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
20a20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20a40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
20a50 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
20a60 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
20a70 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
20a80 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
20a90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
20aa0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
20ab0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
20ac0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
20ad0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
20ae0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
20af0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
20b00 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
20b10 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
20b20 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
20b30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20b40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
20b50 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
20b60 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
20b70 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
20b80 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
20b90 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
20ba0 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
20bb0 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
20bc0 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
20bd0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
20be0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
20bf0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
20c00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
20c10 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
20c20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
20c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c40 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
20c50 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
20c60 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
20c70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20c80 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
20c90 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
20ca0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
20cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
20cc0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
20cd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
20ce0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
20cf0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
20d00 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
20d10 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
20d20 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
20d30 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
20d40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
20d50 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
20d60 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
20d70 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
20d80 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
20d90 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
20da0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20db0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
20dc0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
20dd0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
20de0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
20df0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
20e00 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
20e10 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
20e20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
20e30 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
20e60 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
20e70 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
20e80 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
20e90 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
20ea0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
20eb0 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
20ec0 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ee0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
20ef0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
20f00 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
20f10 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
20f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20f30 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
20f40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
20f50 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
20f60 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
20f70 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
20f80 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
20f90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
20fa0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
20fb0 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
20fc0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
20fd0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
20fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
20ff0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
21000 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
21010 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
21020 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
21030 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
21040 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
21050 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
21060 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
21070 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
21080 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
21090 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
210a0 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
210b0 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
210c0 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
210d0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
210e0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
210f0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
21100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
21110 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
21120 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
21130 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21140 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
21150 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
21160 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
21170 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
21180 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
21190 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
211a0 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
211b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
211c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
211d0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
211e0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
211f0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
21200 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
21210 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
21220 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
21230 30 20 29 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e  0 ) unlink(pShmN
21240 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
21250 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67  .    unixShmPurg
21260 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20  e(pDbFd);.  }.  
21270 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
21280 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
21290 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65  TE_OK;.}...#else
212a0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
212b0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
212c0 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20  ine unixShmLock 
212d0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
212e0 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  ixShmBarrier 0.#
212f0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55   define unixShmU
21300 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
21310 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
21320 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
21330 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
21340 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
21350 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
21360 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
21370 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
21380 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
21390 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
213a0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
213b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
213d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21410 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
21420 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
21430 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
21440 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21450 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
21460 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
21470 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
21480 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
21490 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
214a0 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
214b0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
214c0 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
214d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
214e0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
214f0 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
21500 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
21510 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
21520 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
21530 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
21540 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
21550 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
21560 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
21570 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
21580 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
21590 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
215a0 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
215b0 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
215c0 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
215d0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
215e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
215f0 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
21600 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
21610 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
21620 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
21630 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
21640 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
21650 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
21660 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
21670 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
21680 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
21690 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
216a0 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
216b0 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
216c0 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  untion F, two ob
216d0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
216e0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
216f0 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
21700 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
21710 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
21720 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
21730 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
21740 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
21750 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
21760 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
21770 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
21780 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
21790 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
217a0 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
217b0 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
217c0 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
217d0 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
217e0 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
217f0 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
21800 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
21810 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
21820 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
21830 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
21840 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
21850 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
21860 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
21870 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
21880 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
21890 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
218a0 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
218b0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
218c0 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
218d0 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
218e0 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
218f0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
21900 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
21910 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
21920 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
21930 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
21940 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
21950 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
21960 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
21970 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
21980 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
21990 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
219a0 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54 48  ODS(FINDER, METH
219b0 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c 4f  OD, VERSION, CLO
219c0 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
219d0 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20 5c  , CKLOCK)      \
219e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
219f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21a00 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21a30 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a50 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21a80 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21aa0 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
21ad0 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21af0 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
21b20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
21b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21b40 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
21b70 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
21b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
21b90 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
21bc0 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
21bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
21be0 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
21c10 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
21c20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
21c30 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
21c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c70 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
21c80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
21cb0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
21cc0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
21cd0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
21d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21d10 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
21d20 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
21d50 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
21d60 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
21d70 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d90 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
21da0 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
21db0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
21dc0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
21df0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21e00 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
21e10 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e30 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61 70   \.   unixShmMap
21e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21e50 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
21e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21ea0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21ed0 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
21ee0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
21ef0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
21f00 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21f20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20     unixShmUnmap 
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f40 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
21f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
21fc0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
21fd0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
21fe0 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
21ff0 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
22000 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
22010 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22020 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
22030 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22050 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
22060 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
22100 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
22110 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
22120 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
22130 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
22140 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
22150 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
22160 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
22170 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
22180 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22190 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
221a0 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
221b0 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
221c0 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
221d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
221e0 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
221f0 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
22200 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
22210 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
22220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
22230 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
22240 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
22250 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
22260 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
22270 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
22280 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
222b0 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
222c0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222e0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
222f0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22310 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
22320 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
22330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22340 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
22350 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
22360 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20  rvedLock     /* 
22370 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
22380 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ck method */.).I
22390 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f  OMETHODS(.  nolo
223a0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
223b0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
223c0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
223d0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  .  nolockIoMetho
223e0 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ds,          /* 
223f0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
22400 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
22410 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22430 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
22440 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
22450 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
22460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22470 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
22480 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
22490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
224a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
224b0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
224c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
224d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
224e0 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
224f0 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43 68  vedLock   /* xCh
22500 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
22510 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
22520 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
22530 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
22540 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
22550 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
22560 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
22570 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
22580 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22590 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
225a0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
225b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
225c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
225d0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
225e0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
225f0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
22600 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
22610 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
22620 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
22630 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
22640 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
22650 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
22660 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
22670 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
22680 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b  dLock  /* xCheck
22690 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
226a0 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51  hod */.)..#if SQ
226b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
226c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
226d0 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
226e0 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
226f0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
22700 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
22710 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
22720 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
22730 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
22740 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
22750 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
22780 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
22790 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
227a0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
227b0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
227c0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
227d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
227e0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
227f0 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
22800 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
22810 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
22820 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
22830 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22840 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
22850 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
22860 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
22870 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d  f OS_VXWORKS.IOM
22880 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46  ETHODS(.  semIoF
22890 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
228a0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
228b0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
228c0 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20   semIoMethods,  
228d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
228e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
228f0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
22900 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
22910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22920 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
22930 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65  disabled */.  se
22940 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
22950 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
22960 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  e method */.  se
22970 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
22980 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
22990 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
229a0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
229b0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
229c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
229d0 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  mCheckReservedLo
229e0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
229f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
22a00 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
22a10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
22a20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
22a30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22a40 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
22a50 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
22a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22a70 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
22a80 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
22a90 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
22aa0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
22ab0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22ac0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
22af0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
22b00 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
22b10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22b20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
22b30 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
22b40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b50 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
22b60 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
22b70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
22b80 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
22b90 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
22ba0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
22bb0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
22bc0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
22bd0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  */.).#endif../*.
22be0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
22bf0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61  king method is a
22c00 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20   "super-method" 
22c10 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
22c20 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65  t it.** opens se
22c30 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73  condary file des
22c40 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65  criptors for the
22c50 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20   conch and lock 
22c60 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20  files and.** it 
22c70 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d  uses proxy, dot-
22c80 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66  file, AFP, and f
22c90 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d  lock() locking m
22ca0 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a  ethods on those.
22cb0 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ** secondary fil
22cc0 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65  es.  For this re
22cd0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
22ce0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
22cf0 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b  ts.** proxy lock
22d00 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d  ing is located m
22d10 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e  uch further down
22d20 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42   in the file.  B
22d30 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f  ut we need.** to
22d40 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65   go ahead and de
22d50 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33  fine the sqlite3
22d60 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20  _io_methods and 
22d70 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a  finder function.
22d80 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ** for proxy loc
22d90 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77  king here.  So w
22da0 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
22db0 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  e the I/O method
22dc0 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
22dd0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
22de0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22df0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
22e00 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73  ic int proxyClos
22e10 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e(sqlite3_file*)
22e20 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
22e30 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
22e40 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74  ile*, int);.stat
22e50 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
22e60 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
22e70 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
22e80 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
22e90 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
22ea0 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a  3_file*, int*);.
22eb0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f  IOMETHODS(.  pro
22ec0 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  xyIoFinder,     
22ed0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
22ee0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
22ef0 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f  /.  proxyIoMetho
22f00 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
22f10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22f20 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
22f30 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f50 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
22f60 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
22f70 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20   proxyClose,    
22f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
22f90 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
22fa0 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20   proxyLock,     
22fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
22fc0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
22fd0 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20  proxyUnlock,    
22fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
22ff0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23000 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
23010 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43  vedLock    /* xC
23020 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23030 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
23040 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
23050 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
23060 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
23070 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
23080 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
23090 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
230a0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
230b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
230c0 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
230d0 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
230e0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
230f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23100 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
23110 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
23120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
23130 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23140 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
23150 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
23160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23170 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23180 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
23190 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
231a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
231b0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
231c0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
231d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
231e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
231f0 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
23200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23210 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
23220 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
23230 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78  edLock      /* x
23240 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23250 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
23260 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
23270 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
23280 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23290 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
232a0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
232b0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
232c0 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
232d0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
232e0 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
232f0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
23300 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
23310 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
23320 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
23330 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
23340 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
23350 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
23360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
23370 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
23380 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23390 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
233a0 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
233b0 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
233c0 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
233d0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
233e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
233f0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
23400 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
23410 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
23420 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
23430 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
23440 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
23450 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
23460 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23470 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
23480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
23490 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
234a0 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
234b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
234c0 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
234d0 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
234e0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
234f0 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
23500 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
23510 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
23520 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
23530 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
23540 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
23550 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
23560 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
23570 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
23580 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
23590 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
235a0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
235b0 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
235c0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
235d0 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
235e0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
235f0 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
23600 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
23610 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
23620 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
23630 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
23640 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
23650 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
23660 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
23670 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
23680 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
23690 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
236a0 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
236b0 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
236c0 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
236d0 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
236e0 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
236f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
23700 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
23710 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
23720 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
23730 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
23740 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
23750 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
23760 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
23770 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
23780 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
23790 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
237a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
237b0 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
237c0 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
237d0 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
237e0 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
237f0 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
23800 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
23810 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
23820 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
23830 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
23840 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
23850 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
23860 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
23870 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
23880 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
23890 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
238a0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
238b0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
238c0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
238d0 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
238e0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
238f0 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
23900 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
23910 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
23920 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
23930 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
23940 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
23950 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
23960 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
23970 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
23980 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
23990 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
239a0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
239b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
239c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
239d0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
239e0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
239f0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
23a00 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
23a10 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
23a20 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
23a30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
23a40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23a50 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
23a60 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  if OS_VXWORKS &&
23a70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23a80 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
23a90 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
23aa0 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
23ab0 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
23ac0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
23ad0 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
23ae0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23af0 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
23b00 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
23b10 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
23b20 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
23b30 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
23b40 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
23b50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
23b60 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79  for VXWorks only
23b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
23b80 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
23b90 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
23ba0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
23bb0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
23bc0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
23bd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
23be0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
23bf0 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
23c00 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69    /* the open fi
23c10 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  le object */.){.
23c20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
23c30 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
23c40 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
23c50 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
23c60 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
23c70 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
23c80 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
23c90 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
23ca0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
23cb0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
23cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
23cd0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
23ce0 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20  }..  /* Test if 
23cf0 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f  fcntl() is suppo
23d00 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53  rted and use POS
23d10 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a  IX style locks..
23d20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66    ** Otherwise f
23d30 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
23d40 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
23d50 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c  method..  */.  l
23d60 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
23d70 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
23d80 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
23d90 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
23da0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
23db0 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
23dc0 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
23dd0 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
23de0 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
23df0 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72  o)!=-1 ) {.    r
23e00 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65  eturn &posixIoMe
23e10 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
23e20 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49      return &semI
23e30 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
23e40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
23e50 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23e60 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
23e70 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
23e80 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
23e90 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
23ea0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
23eb0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
23ec0 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  KS && SQLITE_ENA
23ed0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23ee0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  E */../*.** An a
23ef0 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
23f00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23f10 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  IO method finder
23f20 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79   function:.*/.ty
23f30 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69  pedef const sqli
23f40 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
23f50 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63  (*finder_type)(c
23f60 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
23f70 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  ile*);.../******
23f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fc0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
23fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fe0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
23ff0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
24000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24010 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
24020 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
24030 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
24040 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
24050 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
24060 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
24070 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24080 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ze the contents 
24090 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  of the unixFile 
240a0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
240b0 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a  d to by pId..*/.
240c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
240d0 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c  nUnixFile(.  sql
240e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
240f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24100 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
24110 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20  .  int h,       
24120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
24130 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
24140 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67  or of file being
24150 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
24160 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20 20   dirfd,         
24170 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
24180 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
24190 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
241a0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
241b0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
241c0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
241d0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
241e0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
241f0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
24200 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
24210 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  ened */.  int no
24220 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
24230 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e    /* Omit lockin
24240 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  g if true */.  i
24250 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
24260 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
24270 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72 75   on close if tru
24280 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
24290 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
242a0 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
242b0 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
242c0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
242d0 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
242e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
242f0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
24300 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
24310 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73   /* Parameter is
24320 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75  Delete is only u
24330 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  sed on vxworks. 
24340 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70  Express this exp
24350 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65  licitly .  ** he
24360 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f  re to prevent co
24370 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
24380 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72  about unused par
24390 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
243a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
243b0 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f  (isDelete);..  /
243c0 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61  * Usually the pa
243d0 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f  th zFilename sho
243e0 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c  uld not be a rel
243f0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
24400 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69  The.  ** excepti
24410 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69  on is when openi
24420 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f  ng the proxy "co
24430 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69  nch" file in bui
24440 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e  lds that.  ** in
24450 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61  clude the specia
24460 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20  l Apple locking 
24470 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66  styles..  */.#if
24480 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
24490 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
244a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
244b0 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  LE.  assert( zFi
244c0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
244d0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a  lename[0]=='/' .
244e0 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70      || pVfs->pAp
244f0 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61  pData==(void*)&a
24500 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
24510 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72  );.#else.  asser
24520 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
24530 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
24540 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ='/' );.#endif..
24550 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24560 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
24570 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
24580 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
24590 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64   pNew->dirfd = d
245a0 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  irfd;.  pNew->zP
245b0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
245c0 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56  .  if( memcmp(pV
245d0 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d  fs->zName,"unix-
245e0 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a  excl",10)==0 ){.
245f0 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
24600 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45  ags = UNIXFILE_E
24610 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  XCL;.  }else{.  
24620 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
24630 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 23 69 66 20  s = 0;.  }..#if 
24640 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
24650 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
24660 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
24670 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
24680 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
24690 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20   noLock = 1;.   
246a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
246b0 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  EM;.  }.#endif..
246c0 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a    if( noLock ){.
246d0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
246e0 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
246f0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
24700 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
24710 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
24720 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
24730 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
24740 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
24750 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24760 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
24770 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
24780 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
24790 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
247a0 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
247b0 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
247c0 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
247d0 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
247e0 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
247f0 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
24800 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
24810 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
24820 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
24830 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
24840 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
24850 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
24860 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
24870 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
24880 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
24890 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
248a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
248b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
248c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
248d0 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
248e0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
248f0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
24900 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
24910 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
24920 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
24930 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
24940 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
24950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24960 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
24970 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
24980 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
24990 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
249a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
249b0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
249c0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
249d0 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
249e0 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
249f0 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
24a00 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
24a10 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
24a20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
24a30 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
24a40 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
24a50 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
24a60 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
24a70 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
24a80 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
24a90 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
24aa0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
24ab0 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
24ac0 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
24ad0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
24ae0 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
24af0 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
24b00 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
24b10 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
24b20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
24b30 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
24b40 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
24b50 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
24b60 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
24b70 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
24b80 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
24b90 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
24ba0 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
24bb0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
24bc0 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
24bd0 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
24be0 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
24bf0 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
24c00 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
24c10 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
24c20 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
24c30 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
24c40 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
24c50 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
24c60 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
24c70 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
24c80 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
24c90 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
24ca0 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
24cb0 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
24cc0 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
24cd0 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
24ce0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
24cf0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
24d00 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
24d10 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
24d20 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
24d30 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
24d40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24d50 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
24d60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24d70 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
24d80 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
24d90 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
24da0 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
24db0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
24dc0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
24dd0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
24de0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
24df0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
24e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
24e10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
24e20 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
24e30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
24e40 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
24e50 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
24e60 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
24e70 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
24e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24e90 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
24ea0 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c       /* NB: zFil
24eb0 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  ename exists and
24ec0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
24ed0 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73  ntil the file is
24ee0 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a   closed.      **
24ef0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
24f00 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31  quirement F11141
24f10 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20  .  So we do not 
24f20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20  need to make a. 
24f30 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
24f40 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
24f50 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50  .      pCtx->dbP
24f60 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
24f70 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73  .      pCtx->res
24f80 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  erved = 0;.     
24f90 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
24fa0 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
24fb0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
24fc0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
24fd0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
24fe0 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
24ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25010 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b  _free(pNew->lock
25020 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
25030 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
25040 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
25050 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20  E__);.        h 
25060 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
25070 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
25080 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
25090 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
250a0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
250b0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
250c0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
250d0 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
250e0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
250f0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
25100 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
25110 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
25120 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
25130 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
25140 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
25150 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
25160 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46  Filename;.    nF
25170 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
25180 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
25190 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
251a0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
251b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
251c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
251d0 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
251e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
251f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
25200 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
25210 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
25220 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
25230 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
25240 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
25250 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
25260 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
25270 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
25280 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
25290 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
252a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
252b0 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
252c0 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
252d0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
252e0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
252f0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
25300 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
25310 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
25320 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
25330 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
25340 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
25350 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
25360 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
25370 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
25380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
25390 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
253a0 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
253b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
253c0 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
253d0 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
253e0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
253f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25400 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
25410 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
25420 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
25440 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
25450 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
25460 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
25470 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
25480 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
25490 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
254a0 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
254b0 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
254c0 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
254d0 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
254e0 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
254f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
25500 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
25510 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
25520 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25530 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25540 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
25550 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
25560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25570 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
25580 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
25590 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
255a0 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
255b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
255c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
255d0 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
255e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
255f0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
25600 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
25610 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
25620 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65  e);.    isDelete
25630 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
25640 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44  ->isDelete = isD
25650 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20  elete;.#endif.  
25660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25670 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  K ){.    if( dir
25680 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63  fd>=0 ) robust_c
25690 6c 6f 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64  lose(pNew, dirfd
256a0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
256b0 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
256c0 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
256d0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
256e0 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
256f0 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
25700 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
25710 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
25720 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25730 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
25740 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
25750 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
25760 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
25770 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
25780 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
25790 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
257a0 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
257b0 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
257c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
257d0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
257e0 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
257f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
25800 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
25810 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
25820 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
25830 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
25840 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  * value..**.** I
25850 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
25860 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
25870 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
25880 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
25890 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
258a0 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
258b0 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
258c0 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
258d0 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
258e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
258f0 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
25900 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
25910 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
25920 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
25930 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
25940 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
25950 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
25960 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
25970 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
25980 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
25990 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
259a0 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
259b0 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
259c0 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
259d0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
259e0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
259f0 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
25a00 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
25a10 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
25a20 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
25a30 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28  C.      osFcntl(
25a40 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
25a50 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
25a60 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
25a70 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
25a80 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
25a90 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
25aa0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
25ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
25ac0 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
25ad0 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
25ae0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
25af0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
25b00 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
25b10 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
25b20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
25b30 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
25b40 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
25b50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
25b60 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
25b70 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
25b80 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
25b90 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
25ba0 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
25bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
25bc0 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
25bd0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
25be0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
25bf0 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
25c00 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
25c10 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
25c20 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
25c30 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20  p",.     0      
25c40 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
25c50 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75  ator */.  };.  u
25c60 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
25c70 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
25c80 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25c90 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44  zDir = 0;..  azD
25ca0 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
25cb0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
25cc0 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
25cd0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
25ce0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
25cf0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
25d00 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
25d10 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
25d20 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
25d30 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
25d40 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
25d50 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
25d60 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
25d70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
25d80 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
25d90 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
25da0 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
25db0 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
25dc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
25dd0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
25de0 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
25df0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
25e00 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
25e10 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
25e20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
25e30 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
25e40 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
25e50 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
25e60 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
25e70 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
25e80 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
25e90 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
25ea0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
25eb0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
25ec0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
25ed0 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
25ee0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
25ef0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
25f00 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
25f10 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
25f20 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
25f30 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
25f40 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
25f50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
25f60 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  ir;..  /* It's o
25f70 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
25f80 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
25f90 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
25fa0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
25fb0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
25fc0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
25fd0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
25fe0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
25ff0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
26000 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
26010 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
26020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26030 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
26040 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
26050 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
26060 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b  =0 ) zDir = ".";
26070 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
26080 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
26090 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
260a0 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
260b0 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
260c0 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
260d0 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
260e0 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
260f0 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69   if( (strlen(zDi
26100 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49  r) + strlen(SQLI
26110 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
26120 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73  FIX) + 17) >= (s
26130 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20  ize_t)nBuf ){.  
26140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26150 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
26160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
26170 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20  printf(nBuf-17, 
26180 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
26190 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
261a0 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
261b0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
261c0 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
261d0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
261e0 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
261f0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
26200 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
26210 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
26220 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
26230 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
26240 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
26250 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
26260 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
26270 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
26280 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
26290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
262a0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
262b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
262c0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
262d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
262e0 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
262f0 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
26300 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
26310 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
26320 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
26330 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
26340 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
26350 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
26360 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
26370 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
26380 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
26390 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
263a0 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
263b0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
263c0 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
263d0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
263e0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
263f0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
26400 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
26410 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
26420 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
26430 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
26440 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
26450 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
26460 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
26470 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
26480 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
26490 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
264a0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
264b0 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
264c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
264d0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
264e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
264f0 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
26500 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
26510 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
26520 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
26530 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
26540 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
26550 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
26560 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
26570 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
26580 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
26590 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
265a0 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
265b0 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
265c0 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
265d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
265e0 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
265f0 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
26600 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
26610 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
26620 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
26630 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
26640 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
26650 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
26660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
26670 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
26680 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
26690 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
266a0 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
266b0 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
266c0 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
266d0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
266e0 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
266f0 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
26700 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
26710 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
26720 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
26730 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
26740 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
26750 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
26760 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
26770 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
26780 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
26790 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
267a0 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
267b0 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
267c0 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
267d0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
267e0 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
267f0 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
26800 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
26810 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
26820 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
26830 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
26840 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
26850 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
26860 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
26870 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
26880 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
26890 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
268a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
268b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
268c0 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
268d0 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
268e0 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
268f0 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
26900 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
26910 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
26920 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
26930 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
26940 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
26950 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
26960 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
26970 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
26980 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
26990 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
269a0 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
269b0 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
269c0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
269d0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
269e0 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
269f0 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
26a00 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
26a10 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
26a20 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
26a30 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
26a40 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
26a50 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
26a60 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
26a70 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
26a80 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
26a90 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
26aa0 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
26ab0 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
26ac0 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
26ad0 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
26ae0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
26af0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
26b00 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
26b10 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
26b20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
26b30 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
26b40 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
26b50 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
26b60 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
26b90 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
26ba0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
26bb0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
26bc0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
26bd0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
26be0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
26bf0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
26c00 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
26c10 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
26c20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
26c30 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
26c40 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
26c50 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
26c60 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
26c70 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
26c80 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
26c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26ca0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
26cb0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
26cc0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
26cd0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
26ce0 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
26cf0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26d00 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
26d10 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
26d20 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
26d30 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
26d40 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
26d50 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
26d60 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
26d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
26d80 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
26d90 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
26da0 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
26db0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
26dc0 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
26dd0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
26de0 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
26df0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
26e00 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26e10 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
26e20 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
26e30 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
26e40 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
26e50 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   If the file bei
26e60 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74  ng opened is a t
26e70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69  emporary file, i
26e80 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61  t is always crea
26e90 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
26ea0 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e  octal permission
26eb0 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69  s 0600 (read/wri
26ec0 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f  table by owner o
26ed0 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c  nly). If the fil
26ee0 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61  e.** is a databa
26ef0 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75  se or master jou
26f00 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73  rnal file, it is
26f10 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
26f20 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
26f30 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45  * mask SQLITE_DE
26f40 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
26f50 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69  SSIONS..**.** Fi
26f60 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69  nally, if the fi
26f70 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
26f80 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
26f90 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
26fa0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
26fb0 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
26fc0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
26fd0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
26fe0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
26ff0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
27000 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
27010 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
27020 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
27030 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
27040 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
27050 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
27060 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
27070 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
27080 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
27090 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
270a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
270b0 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  t findCreateFile
270c0 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
270d0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
270e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
270f0 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c  of file (possibl
27100 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  y) being created
27110 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
27140 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67  assed as 4th arg
27150 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29  ument to xOpen()
27160 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d   */.  mode_t *pM
27170 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
27180 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65        /* OUT: Pe
27190 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65  rmissions to ope
271a0 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29  n file with */.)
271b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
271c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
271d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
271e0 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67  de */.  if( flag
271f0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
27200 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
27210 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
27220 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d  {.    char zDb[M
27230 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
27240 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27250 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
27260 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20   int nDb;       
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
27290 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a  d bytes in zDb *
272a0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
272b0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
272c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66      /* Output of
272d0 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62   stat() on datab
272e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
272f0 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70   /* zPath is a p
27300 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20  ath to a WAL or 
27310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
27320 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
27330 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a  k derives.    **
27340 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
27350 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
27360 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a  base file from z
27370 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b  Path. This block
27380 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20   handles.    ** 
27390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61  the following na
273a0 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ming conventions
273b0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
273c0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
273d0 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20  journal".    ** 
273e0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
273f0 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  wal".    **   "<
27400 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
27410 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a  nal-NNNN".    **
27420 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
27430 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a  -wal-NNNN".    *
27440 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
27450 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74  NNN is a 4 digit
27460 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e   decimal number.
27470 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67   The NNNN naming
27480 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
27490 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
274a0 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
274b0 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
274c0 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
274d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
274e0 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
274f0 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74  e( nDb>0 && zPat
27500 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44  h[nDb]!='l' ) nD
27510 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20  b--;.    nDb -= 
27520 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
27530 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a  _OPEN_WAL) ? 3 :
27540 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   7);.    memcpy(
27550 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
27560 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
27570 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
27580 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
27590 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
275a0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
275b0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
275c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
275d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
275e0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
275f0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
27600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
27610 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
27620 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
27630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27640 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
27650 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
27660 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65  SSIONS;.  }.  re
27670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27680 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
27690 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
276a0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
276b0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
276c0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
276d0 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
276e0 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
276f0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
27700 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
27710 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
27720 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
27730 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
27740 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
27750 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
27760 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
27770 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
27780 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
27790 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
277a0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
277b0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
277c0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
277d0 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
277e0 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
277f0 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
27800 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
27810 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
27820 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
27830 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
27840 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
27850 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
27860 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
27870 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
27880 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
27890 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
278a0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
278b0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
278c0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
278d0 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
278e0 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
278f0 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
27900 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
27910 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
27920 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
27930 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
27940 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
27950 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
27960 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
27970 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27980 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
27990 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
279a0 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
279b0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
279c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
279d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
279e0 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
279f0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
27a00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
27a10 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
27a20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
27a30 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
27a40 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
27a50 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
27a60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
27a70 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
27a80 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
27a90 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
27aa0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
27ab0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
27ac0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
27ad0 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
27ae0 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
27af0 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
27b00 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
27b30 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
27b40 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
27b50 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b70 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
27b80 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
27b90 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
27ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27bb0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
27bc0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
27bd0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
27be0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
27bf0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
27c00 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
27c10 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
27c20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27c30 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
27c40 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
27c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27c60 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27c70 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
27c80 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
27c90 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
27ca0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
27cb0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
27cc0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
27cd0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
27ce0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
27cf0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
27d00 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
27d10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
27d20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
27d30 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
27d40 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
27d50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27d60 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
27d70 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
27d80 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
27d90 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
27da0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27db0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
27dc0 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
27dd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27de0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
27df0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
27e00 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
27e10 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
27e20 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
27e30 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
27e40 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
27e50 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
27e60 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
27e70 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
27e80 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
27e90 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
27ea0 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
27eb0 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
27ec0 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
27ed0 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  )d..  */.  int i
27ee0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d  sOpenDirectory =
27ef0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
27f00 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
27f10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
27f20 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
27f30 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
27f40 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
27f50 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
27f60 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
27f70 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
27f80 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
27f90 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
27fa0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
27fb0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
27fc0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
27fd0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
27fe0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
27ff0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
28000 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
28010 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
28020 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
28030 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
28040 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
28050 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
28060 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
28070 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
28080 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
28090 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
280a0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
280b0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
280c0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
280d0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
280e0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
280f0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
28100 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
28110 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
28120 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
28130 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
28140 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
28150 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
28160 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
28170 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
28180 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
28190 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
281a0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
281b0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
281c0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
281d0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
281e0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
281f0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
28200 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
28210 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
28220 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
28230 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
28240 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
28250 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
28260 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
28270 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
28280 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
28290 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
282a0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
282b0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
282c0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
282d0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
282e0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
282f0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
28300 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
28310 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
28320 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
28330 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
28340 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
28350 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
28360 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
28370 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
28380 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
28390 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
283a0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
283b0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
283c0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
283d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
283e0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
283f0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
28400 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
28410 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
28420 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
28430 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
28440 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
28450 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
28460 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
28470 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
28480 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28490 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
284a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
284b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
284c0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
284d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
284e0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
284f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28500 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28510 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
28520 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28530 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
28540 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28550 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
28560 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
28570 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
28580 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
28590 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
285a0 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
285b0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
285c0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
285d0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
285e0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
285f0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
28600 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
28610 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
28620 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
28630 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28640 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
28650 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
28660 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
28670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28680 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
28690 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
286a0 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
286b0 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
286c0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
286d0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
286e0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
286f0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
28700 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
28710 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
28720 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
28730 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  ory);.    rc = u
28740 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
28750 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
28760 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
28770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28780 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28790 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
287a0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
287b0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
287c0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
287d0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
287e0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
287f0 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
28800 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
28810 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
28820 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
28830 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
28840 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
28850 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
28860 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
28870 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
28880 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
28890 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
288a0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
288b0 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
288c0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
288d0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
288e0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
288f0 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
28900 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
28910 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
28920 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
28930 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
28940 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
28950 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
28960 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
28970 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
28980 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
28990 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
289a0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
289b0 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
289c0 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
289d0 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
289e0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
289f0 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
28a00 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
28a10 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
28a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
28a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28a40 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55    assert( !p->pU
28a50 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61  nused );.      a
28a60 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
28a70 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c  LITE_OPEN_WAL ||
28a80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28a90 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
28aa0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
28ab0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
28ac0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
28ad0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
28ae0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
28af0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
28b00 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
28b10 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
28b20 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  enFlags));.    i
28b30 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
28b40 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
28b50 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
28b60 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
28b70 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
28b80 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
28b90 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
28ba0 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
28bb0 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
28bc0 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
28bd0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
28be0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
28bf0 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
28c00 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
28c10 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
28c20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
28c30 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
28c40 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
28c50 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66  _RDONLY;.      f
28c60 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
28c70 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
28c80 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
28c90 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
28ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
28cb0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
28cc0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
28cd0 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
28ce0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
28cf0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
28d00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
28d10 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
28d20 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
28d30 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
28d40 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
28d50 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
28d60 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
28d70 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
28d80 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
28d90 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
28da0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
28db0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
28dc0 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
28dd0 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 4e  se.    unlink(zN
28de0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
28df0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
28e00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
28e10 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
28e20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
28e30 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
28e40 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 44  f..  if( isOpenD
28e50 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
28e60 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f  rc = openDirecto
28e70 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66 64  ry(zPath, &dirfd
28e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
28e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28ea0 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65 20    /* It is safe 
28eb0 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20 74  to close fd at t
28ec0 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61 75  his point, becau
28ed0 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  se it is guarant
28ee0 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  eed not.      **
28ef0 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20 61   to be open on a
28f00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
28f10 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e 20  If it were open 
28f20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  on a database fi
28f30 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  le,.      ** it 
28f40 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66  would not be saf
28f50 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74 68  e to close as th
28f60 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73 65  is would release
28f70 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64 0a   any locks held.
28f80 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
28f90 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72 6f  file by this pro
28fa0 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cess.  */.      
28fb0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 53  assert( eType!=S
28fc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
28fd0 44 42 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  DB );.      robu
28fe0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
28ff0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
29000 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
29010 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  hed;.    }.  }..
29020 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
29030 43 0a 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  C.  osFcntl(fd, 
29040 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c  F_SETFD, osFcntl
29050 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29  (fd, F_GETFD, 0)
29060 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a   | FD_CLOEXEC);.
29070 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
29080 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
29090 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
290a0 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
290b0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
290c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
290d0 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
290e0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
290f0 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
29100 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
29110 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  1 ){.    ((unixF
29120 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73  ile*)pFile)->las
29130 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
29140 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30      if( dirfd>=0
29150 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
29160 70 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45  p, dirfd, __LINE
29170 5f 5f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  __);.    robust_
29180 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
29190 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
291a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
291b0 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66  ACCESS;.  }.  if
291c0 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
291d0 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
291e0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
291f0 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
29200 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
29210 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
29220 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
29230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66   }.#endif.  .#if
29240 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29250 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
29260 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
29270 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
29280 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
29290 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
292a0 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
292b0 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
292c0 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
292d0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
292e0 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
292f0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
29300 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
29310 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
29320 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
29330 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
29340 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
29350 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
29360 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
29370 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
29380 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
29390 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
293a0 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
293b0 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
293c0 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
293d0 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
293e0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
293f0 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
29400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29410 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
29420 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
29430 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66  statfs(zPath, &f
29440 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a  sInfo) == -1 ){.
29450 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
29460 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28  eory, the close(
29470 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d  fd) call is sub-
29480 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20  optimal. If the 
29490 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20  file opened.    
294a0 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69      ** with fd i
294b0 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
294c0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
294d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
294e0 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  ns open.        
294f0 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ** on that file 
29500 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
29510 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73  ly holding advis
29520 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c  ory locks on it,
29530 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
29540 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f   the call to clo
29550 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c  se() will cancel
29560 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e   those locks. In
29570 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20   practice,.     
29580 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75     ** we're assu
29590 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73  ming that statfs
295a0 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20  () doesn't fail 
295b0 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c  very often. At l
295c0 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  east.        ** 
295d0 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20  not while other 
295e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
295f0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
29600 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20  ame process on. 
29610 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
29620 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b  me file are work
29630 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ing.  */.       
29640 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20   p->lastErrno = 
29650 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69  errno;.        i
29660 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  f( dirfd>=0 ){. 
29670 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
29680 63 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20  close(p, dirfd, 
29690 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
296a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 6f 62     }.        rob
296b0 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
296c0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
296d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
296e0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
296f0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
29700 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
29710 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  }.      useProxy
29720 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
29730 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
29740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
29750 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
29760 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
29770 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64 69  ile(pVfs, fd, di
29780 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  rfd, pFile, zPat
29790 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c  h, noLock, isDel
297a0 65 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ete);.      if( 
297b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
297c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
297d0 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
297e0 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
297f0 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
29800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29820 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
29830 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
29840 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
29850 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
29860 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
29870 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
29880 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
29890 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
298a0 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
298b0 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
298c0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
298d0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
298e0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
298f0 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
29900 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
29910 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
29920 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
29930 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29950 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
29960 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
29970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
29980 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
29990 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 64  File(pVfs, fd, d
299a0 69 72 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  irfd, pFile, zPa
299b0 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20 69 73 44 65  th, noLock, isDe
299c0 6c 65 74 65 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69  lete);.open_fini
299d0 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
299e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
299f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
29a00 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
29a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
29a20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
29a30 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
29a40 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
29a50 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
29a60 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
29a70 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
29a80 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
29a90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
29aa0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
29ab0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
29ac0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
29ad0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
29ae0 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
29af0 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
29b00 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
29b10 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29b20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
29b30 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
29b40 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
29b50 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
29b60 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
29b70 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
29b80 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
29b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29ba0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29bb0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
29bc0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
29bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
29be0 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
29bf0 28 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  ( unlink(zPath)=
29c00 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d  =(-1) && errno!=
29c10 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65  ENOENT ){.    re
29c20 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
29c30 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
29c40 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
29c50 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66   zPath);.  }.#if
29c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
29c70 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66  BLE_DIRSYNC.  if
29c80 28 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20  ( dirSync ){.   
29c90 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
29ca0 3d 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  = openDirectory(
29cb0 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
29cc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29cd0 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  OK ){.#if OS_VXW
29ce0 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66  ORKS.      if( f
29cf0 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23  sync(fd)==-1 ).#
29d00 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66  else.      if( f
29d10 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69  sync(fd) ).#endi
29d20 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
29d30 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
29d40 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
29d50 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79  _DIR_FSYNC, "fsy
29d60 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  nc", zPath);.   
29d70 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73     }.      robus
29d80 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f  t_close(0, fd, _
29d90 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
29da0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
29db0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29dc0 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 61   Test the exista
29dd0 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
29de0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
29df0 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
29e00 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
29e10 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
29e20 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
29e30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
29e40 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
29e50 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29e60 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
29e70 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
29e80 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
29e90 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
29ea0 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
29eb0 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
29ec0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
29ed0 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
29ee0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
29ef0 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
29f00 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
29f10 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
29f20 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
29f30 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
29f40 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
29f50 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
29f60 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
29f70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
29f80 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
29f90 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
29fa0 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
29fb0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
29fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
29fd0 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
29fe0 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
29ff0 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
2a000 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
2a010 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2a020 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
2a030 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2a040 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
2a050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a060 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2a070 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2a080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a090 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
2a0a0 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2a0b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2a0c0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
2a0d0 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
2a0e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2a0f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2a100 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
2a110 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
2a120 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
2a130 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2a140 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2a150 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
2a160 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
2a170 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
2a180 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
2a190 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
2a1a0 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
2a1b0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
2a1c0 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
2a1d0 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
2a1e0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
2a1f0 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
2a200 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
2a210 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2a220 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28      if( 0==stat(
2a230 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
2a240 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29  buf.st_size==0 )
2a250 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74  {.      *pResOut
2a260 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2a270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a280 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
2a290 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
2a2a0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
2a2b0 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ll pathname. The
2a2c0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a   relative path.*
2a2d0 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61  * is stored as a
2a2e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2a2f0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75  string in the bu
2a300 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
2a310 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a  by.** zPath. .**
2a320 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20  .** zOut points 
2a330 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
2a340 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f  t least sqlite3_
2a350 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62  vfs.mxPathname b
2a360 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69  ytes .** (in thi
2a370 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48  s case, MAX_PATH
2a380 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65  NAME bytes). The
2a390 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72   full-path is wr
2a3a0 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73  itten to.** this
2a3b0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 72   buffer before r
2a3c0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
2a3d0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c  tic int unixFull
2a3e0 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2a3f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a410 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2a420 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2a430 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2a440 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2a450 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2a460 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2a470 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
2a480 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2a490 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2a4a0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2a4b0 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4d0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2a4e0 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  /.){..  /* It's 
2a4f0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2a500 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2a510 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2a520 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2a530 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2a540 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2a550 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2a560 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2a570 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2a580 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
2a590 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
2a5a0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
2a5b0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
2a5c0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
2a5d0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
2a5e0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
2a5f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2a600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a610 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  RROR );..  asser
2a620 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t( pVfs->mxPathn
2a630 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d  ame==MAX_PATHNAM
2a640 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  E );.  UNUSED_PA
2a650 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
2a660 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d    zOut[nOut-1] =
2a670 20 27 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61   '\0';.  if( zPa
2a680 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[0]=='/' ){.  
2a690 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2a6a0 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
2a6b0 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
2a6c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
2a6d0 77 64 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  wd;.    if( osGe
2a6e0 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d  tcwd(zOut, nOut-
2a6f0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
2a700 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
2a710 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2a720 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
2a730 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
2a740 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74  .    nCwd = (int
2a750 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20  )strlen(zOut);. 
2a760 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2a770 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26  ntf(nOut-nCwd, &
2a780 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73  zOut[nCwd], "/%s
2a790 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  ", zPath);.  }. 
2a7a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a7b0 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  K;.}...#ifndef S
2a7c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2a7d0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
2a7e0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
2a7f0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
2a800 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
2a810 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
2a820 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
2a830 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
2a840 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
2a850 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ed library..*/.#
2a860 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68  include <dlfcn.h
2a870 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75  >.static void *u
2a880 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  nixDlOpen(sqlite
2a890 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
2a8a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2a8b0 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44  ename){.  UNUSED
2a8c0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2a8d0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c  ed);.  return dl
2a8e0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
2a8f0 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f  RTLD_NOW | RTLD_
2a900 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  GLOBAL);.}../*.*
2a910 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  * SQLite calls t
2a920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d  his function imm
2a930 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61  ediately after a
2a940 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53   call to unixDlS
2a950 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44  ym() or.** unixD
2a960 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72  lOpen() fails (r
2a970 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f  eturns a null po
2a980 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72  inter). If a mor
2a990 65 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72  e detailed error
2a9a0 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61  .** message is a
2a9b0 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20  vailable, it is 
2a9c0 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f  written to zBufO
2a9d0 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ut. If no error 
2a9e0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76  message.** is av
2a9f0 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74  ailable, zBufOut
2aa00 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
2aa10 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75  ied and SQLite u
2aa20 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a  ses a default.**
2aa30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
2aa40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2aa50 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  nixDlError(sqlit
2aa60 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2aa70 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2aa80 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e  *zBufOut){.  con
2aa90 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
2aaa0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2aab0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e  R(NotUsed);.  un
2aac0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2aad0 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72    zErr = dlerror
2aae0 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29  ();.  if( zErr )
2aaf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2ab00 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
2ab10 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72  fOut, "%s", zErr
2ab20 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
2ab30 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61  veMutex();.}.sta
2ab40 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44  tic void (*unixD
2ab50 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
2ab60 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20   *NotUsed, void 
2ab70 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a  *p, const char*z
2ab80 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f  Sym))(void){.  /
2ab90 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68  * .  ** GCC with
2aba0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
2abb0 73 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20  s says that C90 
2abc0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
2abd0 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a   void* to be.  *
2abe0 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f  * cast into a po
2abf0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
2ac00 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68  ion.  And yet th
2ac10 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28  e library dlsym(
2ac20 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72  ) routine.  ** r
2ac30 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77  eturns a void* w
2ac40 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
2ac50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
2ac60 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20  nction.  So how 
2ac70 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64  do we.  ** use d
2ac80 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64  lsym() with -ped
2ac90 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20  antic-errors?.  
2aca0 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
2acb0 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69   x below is defi
2acc0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e  ned to be a poin
2acd0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2ace0 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61  n taking.  ** pa
2acf0 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61  rameters void* a
2ad00 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61  nd const char* a
2ad10 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70  nd returning a p
2ad20 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2ad30 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e  tion..  ** We in
2ad40 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73  itialize x by as
2ad50 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69  signing it a poi
2ad60 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79  nter to the dlsy
2ad70 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  m() function..  
2ad80 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d  ** (That assignm
2ad90 65 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63  ent requires a c
2ada0 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63  ast.)  Then we c
2adb0 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  all the function
2adc0 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69   that.  ** x poi
2add0 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20  nts to.  .  **. 
2ade0 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72   ** This work-ar
2adf0 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79  ound is unlikely
2ae00 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
2ae10 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d  ly on any system
2ae20 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20   where.  ** you 
2ae30 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61  really cannot ca
2ae40 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  st a function po
2ae50 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a  inter into void*
2ae60 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20  .  But then, on 
2ae70 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  the.  ** other h
2ae80 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c  and, dlsym() wil
2ae90 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75  l not work on su
2aea0 63 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68  ch a system eith
2aeb0 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20  er, so we have. 
2aec0 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c   ** not really l
2aed0 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20  ost anything..  
2aee0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29  */.  void (*(*x)
2aef0 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
2af00 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e  r*))(void);.  UN
2af10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2af20 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28  otUsed);.  x = (
2af30 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c  void(*(*)(void*,
2af40 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2af50 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74  id))dlsym;.  ret
2af60 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d  urn (*x)(p, zSym
2af70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2af80 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c   unixDlClose(sql
2af90 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2afa0 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  d, void *pHandle
2afb0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2afc0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2afd0 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c    dlclose(pHandl
2afe0 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  e);.}.#else /* i
2aff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2b000 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20  AD_EXTENSION is 
2b010 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64  defined: */.  #d
2b020 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e  efine unixDlOpen
2b030 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2b040 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  ixDlError 0.  #d
2b050 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20  efine unixDlSym 
2b060 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e    0.  #define un
2b070 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  ixDlClose 0.#end
2b080 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
2b090 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
2b0a0 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65  ndom data to the
2b0b0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
2b0c0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2b0d0 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e   int unixRandomn
2b0e0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
2b0f0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2b100 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2b110 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b120 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b130 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e  assert((size_t)n
2b140 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d  Buf>=(sizeof(tim
2b150 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  e_t)+sizeof(int)
2b160 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76  ));..  /* We hav
2b170 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
2b180 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
2b190 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
2b1a0 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
2b1b0 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
2b1c0 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
2b1d0 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
2b1e0 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
2b1f0 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
2b200 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
2b210 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
2b220 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
2b230 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
2b240 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
2b250 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
2b260 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
2b270 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
2b280 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
2b290 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
2b2a0 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
2b2b0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
2b2c0 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
2b2d0 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
2b2e0 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
2b2f0 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
2b300 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
2b310 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
2b320 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
2b330 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
2b340 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
2b350 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
2b360 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
2b370 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
2b380 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
2b390 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
2b3a0 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73   sequence.  This
2b3b0 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
2b3c0 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
2b3d0 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
2b3e0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2b3f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b400 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
2b410 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
2b420 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2b430 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
2b440 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
2b450 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
2b460 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
2b470 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
2b480 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
2b490 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
2b4a0 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
2b4b0 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
2b4c0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
2b4d0 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
2b4e0 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
2b4f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
2b500 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
2b510 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
2b520 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
2b530 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
2b540 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
2b550 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42  se{.      do{ nB
2b560 75 66 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  uf = osRead(fd, 
2b570 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
2b580 69 6c 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65  ile( nBuf<0 && e
2b590 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
2b5a0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
2b5b0 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
2b5c0 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  _);.    }.  }.#e
2b5d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42  ndif.  return nB
2b5e0 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c  uf;.}.../*.** Sl
2b5f0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
2b600 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
2b610 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
2b620 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
2b630 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2b640 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
2b650 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
2b660 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65  to sleep..** The
2b670 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2b680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2b690 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73  icroseconds of s
2b6a0 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  leep actually.**
2b6b0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
2b6c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
2b6d0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c  perating system,
2b6e0 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a   a number which.
2b6f0 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61  ** might be grea
2b700 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
2b710 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e  l to the argumen
2b720 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a  t, but not less.
2b730 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75  ** than the argu
2b740 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
2b750 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71  int unixSleep(sq
2b760 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2b770 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  ed, int microsec
2b780 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58  onds){.#if OS_VX
2b790 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
2b7a0 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73  imespec sp;..  s
2b7b0 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f  p.tv_sec = micro
2b7c0 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30  seconds / 100000
2b7d0 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20  0;.  sp.tv_nsec 
2b7e0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  = (microseconds 
2b7f0 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30  % 1000000) * 100
2b800 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26  0;.  nanosleep(&
2b810 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55  sp, NULL);.  UNU
2b820 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2b830 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
2b840 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
2b850 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
2b860 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
2b870 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
2b880 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b  p(microseconds);
2b890 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b8a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b8b0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
2b8c0 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  nds;.#else.  int
2b8d0 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72   seconds = (micr
2b8e0 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29  oseconds+999999)
2b8f0 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65  /1000000;.  slee
2b900 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  p(seconds);.  UN
2b910 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2b920 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2b930 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30  n seconds*100000
2b940 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
2b950 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2b960 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
2b970 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
2b980 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
2b990 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
2b9a0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
2b9b0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
2b9c0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
2b9d0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2b9e0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
2b9f0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
2ba00 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
2ba10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2ba20 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
2ba30 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
2ba40 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
2ba50 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
2ba60 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
2ba70 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
2ba80 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2ba90 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2baa0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2bab0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
2bac0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
2bad0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2bae0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2baf0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
2bb00 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
2bb10 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
2bb20 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
2bb30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
2bb40 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
2bb50 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
2bb60 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
2bb70 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
2bb80 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
2bb90 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
2bba0 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
2bbb0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
2bbc0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
2bbd0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20  cess, return 0. 
2bbe0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2bbf0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
2bc00 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
2bc10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2bc20 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
2bc30 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
2bc40 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
2bc50 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2bc60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2bc70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
2bc80 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
2bc90 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2bca0 29 38 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65  )8640000;.#if de
2bcb0 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29  fined(NO_GETTOD)
2bcc0 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74  .  time_t t;.  t
2bcd0 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f  ime(&t);.  *piNo
2bce0 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  w = ((sqlite3_in
2bcf0 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e  t64)t)*1000 + un
2bd00 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f  ixEpoch;.#elif O
2bd10 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2bd20 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77  ct timespec sNow
2bd30 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  ;.  clock_gettim
2bd40 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45  e(CLOCK_REALTIME
2bd50 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e  , &sNow);.  *piN
2bd60 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
2bd70 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2bd80 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
2bd90 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f   + sNow.tv_nsec/
2bda0 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20  1000000;.#else. 
2bdb0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
2bdc0 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f  sNow;.  gettimeo
2bdd0 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a  fday(&sNow, 0);.
2bde0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
2bdf0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
2be00 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
2be10 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
2be20 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
2be30 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2be40 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2be50 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2be60 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2be70 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2be80 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2be90 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2bea0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2beb0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2bec0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2bed0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2bee0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2bef0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2bf00 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2bf10 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2bf20 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2bf30 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2bf40 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2bf50 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2bf60 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2bf70 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2bf80 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2bf90 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2bfa0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2bfb0 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
2bfc0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
2bfd0 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
2bfe0 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65  prNow){.  sqlite
2bff0 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55  3_int64 i;.  UNU
2c000 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c010 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75  tUsed);.  unixCu
2c020 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30  rrentTimeInt64(0
2c030 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  , &i);.  *prNow 
2c040 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2c050 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2c060 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
2c070 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
2c080 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
2c090 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
2c0a0 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
2c0b0 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
2c0c0 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
2c0d0 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
2c0e0 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
2c0f0 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
2c100 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
2c110 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
2c120 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
2c130 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
2c140 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
2c150 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
2c160 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
2c170 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
2c180 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
2c190 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
2c1a0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
2c1b0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2c1c0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2c1d0 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
2c1e0 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
2c1f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2c200 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
2c210 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2c220 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
2c230 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c240 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
2c250 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
2c260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c270 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
2c280 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2c2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c2f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2c300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2c350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c360 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
2c370 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
2c380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2c3a0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2c3b0 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
2c3c0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
2c3d0 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
2c3e0 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
2c3f0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2c400 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
2c410 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
2c420 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
2c430 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
2c440 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
2c450 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
2c460 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
2c470 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
2c480 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2c490 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2c4a0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2c4b0 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
2c4c0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
2c4d0 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
2c4e0 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
2c4f0 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
2c500 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
2c510 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
2c520 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2c530 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
2c540 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
2c550 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
2c560 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
2c570 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
2c580 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
2c590 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
2c5a0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
2c5b0 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
2c5c0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
2c5d0 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
2c5e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2c5f0 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
2c600 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
2c610 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2c620 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
2c630 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
2c640 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
2c650 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
2c660 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
2c670 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
2c680 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
2c690 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
2c6a0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
2c6b0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
2c6c0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
2c6d0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
2c6e0 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
2c6f0 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
2c700 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
2c710 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
2c720 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
2c730 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
2c740 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
2c750 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
2c760 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
2c770 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
2c780 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
2c790 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
2c7a0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
2c7b0 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
2c7c0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
2c7d0 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
2c7e0 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
2c7f0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
2c800 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2c810 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2c820 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
2c830 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2c840 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
2c850 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
2c860 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
2c870 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
2c880 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20  00000..   ..**  
2c890 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
2c8a0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
2c8b0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
2c8c0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
2c8d0 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
2c8e0 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
2c8f0 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
2c900 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2c910 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
2c920 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
2c930 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
2c940 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
2c950 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
2c960 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
2c970 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
2c980 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
2c990 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2c9a0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
2c9b0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
2c9c0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
2c9d0 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
2c9e0 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
2c9f0 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
2ca00 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
2ca10 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
2ca20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
2ca30 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
2ca40 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
2ca50 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
2ca60 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
2ca70 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
2ca80 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
2ca90 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
2caa0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
2cab0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
2cac0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
2cad0 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
2cae0 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
2caf0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
2cb00 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
2cb10 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2cb20 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
2cb30 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
2cb40 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
2cb50 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
2cb60 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
2cb70 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
2cb80 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
2cb90 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2cba0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
2cbb0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
2cbc0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
2cbd0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
2cbe0 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
2cbf0 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
2cc00 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
2cc10 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
2cc20 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
2cc30 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
2cc40 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
2cc50 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
2cc60 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
2cc70 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
2cc80 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
2cc90 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
2cca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ccb0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
2ccc0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2ccd0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2cce0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
2ccf0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
2cd00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2cd10 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
2cd20 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
2cd30 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
2cd40 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2cd50 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
2cd60 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2cd70 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
2cd80 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
2cd90 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
2cda0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
2cdb0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2cdc0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
2cdd0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
2cde0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2cdf0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
2ce00 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
2ce10 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
2ce20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
2ce30 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
2ce40 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
2ce50 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
2ce60 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
2ce70 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
2ce80 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
2ce90 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
2cea0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
2ceb0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
2cec0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
2ced0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2cee0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
2cef0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
2cf00 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
2cf10 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
2cf20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
2cf30 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
2cf40 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
2cf50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
2cf60 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2cf70 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
2cf80 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
2cf90 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
2cfa0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
2cfb0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
2cfc0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
2cfd0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
2cfe0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
2cff0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
2d000 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
2d010 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
2d020 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
2d030 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
2d040 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
2d050 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
2d060 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2d070 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
2d080 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
2d090 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
2d0a0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
2d0b0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
2d0c0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
2d0d0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
2d0e0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
2d0f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
2d100 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
2d110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2d120 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
2d130 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
2d140 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
2d150 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
2d160 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
2d170 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
2d180 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
2d190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d1a0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
2d1b0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
2d1c0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
2d1d0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
2d1e0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
2d1f0 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
2d200 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
2d210 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
2d220 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
2d230 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2d240 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
2d250 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
2d260 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
2d270 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
2d280 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
2d290 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
2d2a0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2d2b0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
2d2c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
2d2d0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
2d2e0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
2d2f0 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
2d300 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
2d310 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
2d320 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
2d330 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
2d340 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
2d350 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
2d360 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
2d370 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
2d380 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
2d390 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
2d3a0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
2d3b0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2d3c0 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
2d3d0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
2d3e0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
2d3f0 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
2d400 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
2d410 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
2d420 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
2d430 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
2d440 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
2d450 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
2d460 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
2d470 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
2d480 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2d490 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
2d4a0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
2d4b0 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
2d4c0 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
2d4d0 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
2d4e0 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
2d4f0 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
2d500 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
2d510 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
2d520 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
2d530 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
2d540 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
2d550 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
2d560 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2d570 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2d580 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
2d590 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
2d5a0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
2d5b0 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
2d5c0 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
2d5d0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
2d5e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
2d5f0 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
2d600 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
2d610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d620 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
2d630 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2d640 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
2d650 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
2d660 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
2d670 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
2d680 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
2d690 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
2d6a0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
2d6b0 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
2d6c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
2d6d0 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
2d6e0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
2d6f0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
2d700 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
2d710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2d720 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
2d730 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
2d740 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
2d750 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
2d760 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
2d770 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
2d780 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
2d790 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
2d7a0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
2d7b0 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
2d7c0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2d7d0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
2d7e0 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
2d7f0 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
2d800 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2d810 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d820 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
2d830 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2d840 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
2d850 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
2d860 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
2d870 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
2d880 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
2d890 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
2d8a0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
2d8b0 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2d8c0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2d8d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2d8e0 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
2d8f0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
2d900 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
2d910 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
2d920 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
2d930 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
2d940 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
2d950 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
2d960 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
2d970 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
2d980 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
2d990 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2d9a0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2d9b0 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
2d9c0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
2d9d0 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
2d9e0 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
2d9f0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
2da00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
2da10 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
2da20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
2da30 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
2da40 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
2da50 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
2da60 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
2da70 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
2da80 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
2da90 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
2daa0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
2dab0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
2dac0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
2dad0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
2dae0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
2daf0 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
2db00 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
2db10 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2db20 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
2db30 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
2db40 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
2db50 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
2db60 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
2db70 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
2db80 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
2db90 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
2dba0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
2dbb0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
2dbc0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
2dbd0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
2dbe0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
2dbf0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2dc00 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
2dc10 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
2dc20 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
2dc30 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2dc40 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
2dc50 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
2dc60 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2dc70 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
2dc80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
2dc90 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
2dca0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
2dcb0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
2dcc0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
2dcd0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2dce0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
2dcf0 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
2dd00 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
2dd10 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
2dd20 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
2dd30 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
2dd40 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
2dd50 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
2dd60 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
2dd70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
2dd80 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
2dd90 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2dda0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
2ddb0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2ddc0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2ddd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
2dde0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
2ddf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
2de00 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
2de10 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
2de20 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
2de30 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
2de40 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
2de50 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
2de60 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2de70 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
2de80 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
2de90 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2dea0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
2deb0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2dec0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
2ded0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
2dee0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
2def0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2df00 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
2df10 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2df20 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
2df30 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
2df40 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2df50 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
2df60 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
2df70 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2df80 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
2df90 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
2dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfb0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
2dfc0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
2dfd0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
2dfe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
2dff0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
2e000 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
2e010 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
2e020 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2e030 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
2e040 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
2e050 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
2e060 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
2e070 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
2e080 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
2e090 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2e0a0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
2e0b0 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
2e0c0 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
2e0d0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
2e0e0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
2e0f0 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
2e100 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
2e110 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
2e120 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
2e130 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
2e140 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
2e150 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
2e160 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
2e170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2e180 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
2e190 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
2e1a0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
2e1b0 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
2e1c0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
2e1d0 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
2e1e0 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
2e1f0 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
2e200 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
2e210 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
2e220 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
2e230 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
2e240 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
2e250 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
2e260 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2e270 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
2e280 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
2e290 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
2e2a0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
2e2b0 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
2e2c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2e2d0 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
2e2e0 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  o, getpid()));. 
2e2f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e300 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2e310 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
2e320 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
2e330 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
2e340 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
2e350 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
2e360 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
2e370 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
2e380 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
2e390 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
2e3a0 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
2e3b0 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
2e3c0 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
2e3d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
2e3e0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
2e3f0 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
2e400 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
2e410 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
2e420 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
2e430 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
2e440 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
2e450 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
2e460 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
2e470 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
2e480 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
2e490 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
2e4a0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
2e4b0 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
2e4c0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
2e4d0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
2e4e0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
2e4f0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2e500 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
2e510 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29  Path, getpid()))
2e520 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e530 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
2e540 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
2e550 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
2e560 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
2e570 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
2e580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2e590 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2e5a0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
2e5b0 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
2e5c0 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
2e5d0 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
2e5e0 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
2e5f0 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
2e600 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
2e610 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
2e620 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
2e630 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
2e640 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
2e650 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
2e660 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
2e670 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
2e680 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
2e690 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
2e6a0 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
2e6b0 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
2e6c0 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
2e6d0 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
2e6e0 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
2e6f0 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
2e700 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
2e710 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
2e720 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
2e730 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2e740 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
2e750 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
2e760 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
2e770 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2e780 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
2e790 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
2e7a0 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
2e7b0 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66     if( mkdir(buf
2e7c0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2e7d0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2e7e0 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
2e7f0 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
2e800 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
2e810 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
2e820 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
2e830 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
2e840 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
2e850 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
2e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e870 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
2e880 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2e890 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2e8a0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
2e8b0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
2e8c0 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2e8d0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
2e8e0 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
2e8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e900 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e910 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
2e920 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
2e930 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
2e940 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
2e950 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
2e960 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2e970 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
2e980 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2e990 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2e9a0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2e9b0 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63 72  w VFS file descr
2e9c0 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e  iptor (stored in
2e9d0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
2e9e0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2e9f0 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65  _malloc) and ope
2ea00 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64  n the file named
2ea10 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20 66   "path" in the f
2ea20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
2ea30 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
2ea40 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2ea50 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f  not only for clo
2ea60 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65  sing the file de
2ea70 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20  scriptor.** but 
2ea80 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67  also for freeing
2ea90 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f   the memory asso
2eaa0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2eab0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
2eac0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2ead0 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46 69  roxyCreateUnixFi
2eae0 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le(.    const ch
2eaf0 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
2eb00 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65   /* path for the
2eb10 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f   new unixFile */
2eb20 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a  .    unixFile **
2eb30 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a  ppFile,       /*
2eb40 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65   unixFile create
2eb50 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62  d and returned b
2eb60 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74  y ref */.    int
2eb70 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20   islockfile     
2eb80 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20        /* if non 
2eb90 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72  zero missing dir
2eba0 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  s will be create
2ebb0 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66  d */.) {.  int f
2ebc0 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69  d = -1;.  int di
2ebd0 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78  rfd = -1;.  unix
2ebe0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
2ebf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ec00 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
2ec10 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
2ec20 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
2ec30 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
2ec40 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
2ec50 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2ec60 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
2ec70 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
2ec80 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
2ec90 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
2eca0 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
2ecb0 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
2ecc0 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
2ecd0 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
2ece0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
2ecf0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
2ed00 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
2ed10 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
2ed20 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
2ed30 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2ed40 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
2ed50 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
2ed60 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
2ed70 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
2ed80 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
2ed90 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
2eda0 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
2edb0 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
2edc0 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
2edd0 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
2ede0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
2edf0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
2ee00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2ee10 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2ee20 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55  d));.    if( !pU
2ee30 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72  nused ){.      r
2ee40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ee50 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
2ee60 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2ee70 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2ee80 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2ee90 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2eea0 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2eeb0 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2eec0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2eed0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2eee0 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2eef0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2ef00 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2ef10 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2ef20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ef30 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2ef40 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2ef50 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2ef60 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2ef70 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
2ef80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2ef90 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
2efa0 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
2efb0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
2efc0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
2efd0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
2efe0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2eff0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
2f000 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
2f010 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2f020 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
2f030 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2f040 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2f050 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
2f060 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
2f070 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
2f080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f090 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
2f0a0 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
2f0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f0c0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
2f0d0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
2f0e0 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
2f0f0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2f100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f110 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2f120 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
2f130 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
2f140 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
2f150 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
2f160 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
2f170 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
2f180 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f190 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
2f1a0 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
2f1b0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
2f1c0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2f1d0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
2f1e0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2f1f0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
2f200 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
2f210 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2f220 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20  ;.  pUnused->fd 
2f230 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d  = fd;.  pUnused-
2f240 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  >flags = openFla
2f250 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75  gs;.  pNew->pUnu
2f260 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
2f270 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55   .  rc = fillInU
2f280 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66  nixFile(&dummyVf
2f290 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73  s, fd, dirfd, (s
2f2a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
2f2b0 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a  w, path, 0, 0);.
2f2c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
2f2e0 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
2f2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f300 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
2f310 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
2f320 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2f330 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2f340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2f350 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
2f360 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
2f370 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2f380 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2f390 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
2f3a0 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
2f3b0 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
2f3c0 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
2f3d0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
2f3e0 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
2f3f0 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2f400 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2f410 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
2f420 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
2f430 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61  gth */../* Not a
2f440 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
2f450 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
2f460 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
2f470 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
2f480 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
2f490 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
2f4a0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
2f4b0 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  ;../* get the ho
2f4c0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
2f4d0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
2f4e0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
2f4f0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
2f500 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
2f510 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
2f520 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2f530 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
2f540 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
2f550 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
2f560 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
2f570 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
2f580 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
2f590 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
2f5a0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
2f5b0 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  N);.#if defined(
2f5c0 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAX_OS_X_VERSI
2f5d0 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29  ON_MIN_REQUIRED)
2f5e0 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
2f5f0 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56   && __MAC_OS_X_V
2f600 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
2f610 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20 20  RED<1050.  {.   
2f620 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2f630 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
2f640 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
2f650 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
2f660 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
2f670 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
2f680 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
2f690 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
2f6a0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
2f6b0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
2f6c0 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
2f6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2f6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2f6f0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
2f700 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2f710 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75  E_TEST.  /* simu
2f720 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
2f730 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
2f740 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
2f750 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66  le paths */.  if
2f760 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  ( sqlite3_hostid
2f770 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20  _num != 0){.    
2f780 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68  pHostID[0] = (ch
2f790 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b  ar)(pHostID[0] +
2f7a0 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f   (char)(sqlite3_
2f7b0 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46  hostid_num & 0xF
2f7c0 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  F));.  }.#endif.
2f7d0 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
2f7e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
2f7f0 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
2f800 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c  ains the header,
2f810 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63   host id and loc
2f820 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a  k file path. */.
2f830 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f  #define PROXY_CO
2f840 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f  NCHVERSION 2   /
2f850 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c  * 1-byte header,
2f860 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64   16-byte host id
2f870 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e  , path */.#defin
2f880 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  e PROXY_HEADERLE
2f890 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63  N    1   /* conc
2f8a0 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65  h file header le
2f8b0 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ngth */.#define 
2f8c0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
2f8d0 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52     (PROXY_HEADER
2f8e0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
2f8f0 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f  LEN).#define PRO
2f900 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20  XY_MAXCONCHLEN  
2f910 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
2f920 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
2f930 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a  +MAXPATHLEN)../*
2f940 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70   .** Takes an op
2f950 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63  en conch file, c
2f960 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  opies the conten
2f970 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68  ts to a new path
2f980 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20   and then moves 
2f990 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68  .** it back.  Th
2f9a0 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  e newly created 
2f9b0 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63  file's file desc
2f9c0 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e  riptor is assign
2f9d0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ed to the.** con
2f9e0 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  ch file structur
2f9f0 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68  e and finally th
2fa00 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68  e original conch
2fa10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2fa20 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20   is .** closed. 
2fa30 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   Returns zero if
2fa40 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a   successful..*/.
2fa50 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2fa60 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75  BreakConchLock(u
2fa70 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
2fa80 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29  uuid_t myHostID)
2fa90 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
2faa0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
2fab0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
2fac0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
2fad0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20  ckingContext; . 
2fae0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
2faf0 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
2fb00 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74  chFile;.  char t
2fb10 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
2fb20 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f  ;.  char buf[PRO
2fb30 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2fb40 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d  .  char *cPath =
2fb50 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2fb60 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72  Path;.  size_t r
2fb70 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69  eadLen = 0;.  si
2fb80 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30  ze_t pathLen = 0
2fb90 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b  ;.  char errmsg[
2fba0 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20  64] = "";.  int 
2fbb0 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  fd = -1;.  int r
2fbc0 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44  c = -1;.  UNUSED
2fbd0 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73  _PARAMETER(myHos
2fbe0 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61  tID);..  /* crea
2fbf0 74 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79  te a new path by
2fc00 20 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61   replace the tra
2fc10 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77  iling '-conch' w
2fc20 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a  ith '-break' */.
2fc30 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c    pathLen = strl
2fc40 63 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68  cpy(tPath, cPath
2fc50 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20  , MAXPATHLEN);. 
2fc60 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58   if( pathLen>MAX
2fc70 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c  PATHLEN || pathL
2fc80 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73  en<6 || .     (s
2fc90 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61  trlcpy(&tPath[pa
2fca0 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b  thLen-5], "break
2fcb0 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20  ", 6) != 5) ){. 
2fcc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fcd0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
2fce0 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20  g),errmsg,"path 
2fcf0 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
2fd00 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20  (int)pathLen);. 
2fd10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2fd20 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
2fd30 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63  read the conch c
2fd40 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64  ontent */.  read
2fd50 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  Len = osPread(co
2fd60 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c  nchFile->h, buf,
2fd70 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
2fd80 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  EN, 0);.  if( re
2fd90 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48  adLen<PROXY_PATH
2fda0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c  INDEX ){.    sql
2fdb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2fdc0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72  zeof(errmsg),err
2fdd0 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20  msg,"read error 
2fde0 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72  (len %d)",(int)r
2fdf0 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74  eadLen);.    got
2fe00 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
2fe10 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20  .  }.  /* write 
2fe20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65  it out to the te
2fe30 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69  mporary break fi
2fe40 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62  le */.  fd = rob
2fe50 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20  ust_open(tPath, 
2fe60 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c  (O_RDWR|O_CREAT|
2fe70 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20 20 20 20  O_EXCL),.       
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2fe90 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2fea0 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2feb0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2fec0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2fed0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
2fee0 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65   errmsg, "create
2fef0 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
2ff00 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
2ff10 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2ff20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74   }.  if( osPwrit
2ff30 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
2ff40 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65  en, 0) != (ssize
2ff50 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  _t)readLen ){.  
2ff60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ff70 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
2ff80 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74  ), errmsg, "writ
2ff90 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2ffa0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2ffb0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2ffc0 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65    }.  if( rename
2ffd0 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29  (tPath, cPath) )
2ffe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2fff0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30000 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
30010 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25  rename failed (%
30020 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
30030 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
30040 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ock;.  }.  rc = 
30050 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  0;.  fprintf(std
30060 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c  err, "broke stal
30070 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c  e lock on %s\n",
30080 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73   cPath);.  robus
30090 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63  t_close(pFile, c
300a0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  onchFile->h, __L
300b0 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46  INE__);.  conchF
300c0 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63  ile->h = fd;.  c
300d0 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  onchFile->openFl
300e0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
300f0 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65  _CREAT;..end_bre
30100 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63  aklock:.  if( rc
30110 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d   ){.    if( fd>=
30120 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  0 ){.      unlin
30130 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
30140 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
30150 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
30160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
30170 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
30180 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
30190 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
301a0 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
301b0 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
301c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
301d0 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
301e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
301f0 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
30200 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
30210 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
30220 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
30230 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
30240 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
30250 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
30260 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
30270 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
30280 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
30290 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
302a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
302b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
302c0 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
302d0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
302e0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
302f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30300 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
30310 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
30320 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
30330 64 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b  dTime;.  .  do {
30340 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
30350 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
30360 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
30370 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
30380 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
30390 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
303a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
303b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
303c0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
303d0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
303e0 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
303f0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
30400 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
30410 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
30420 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
30430 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
30440 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
30450 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
30460 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
30470 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
30480 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
30490 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
304a0 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
304b0 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
304c0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
304d0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
304e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
304f0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
30500 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
30510 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
30520 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
30530 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
30540 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
30550 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30560 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
30570 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
30580 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
30590 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
305a0 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
305b0 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
305c0 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
305d0 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
305e0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
305f0 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
30600 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
30610 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
30620 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
30630 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
30640 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
30650 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
30660 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
30670 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
30680 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
30690 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
306a0 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
306b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
306c0 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
306d0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
306e0 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
306f0 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
30700 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
30710 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
30720 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
30730 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
30740 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
30750 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
30760 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
30770 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
30780 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
30790 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
307a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
307b0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
307c0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
307d0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
307e0 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
307f0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
30800 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
30810 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
30820 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
30830 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
30840 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
30850 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
30860 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
30870 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
30880 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
30890 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
308a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
308b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
308c0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
308d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
308e0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
308f0 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
30900 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
30910 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
30920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30930 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
30940 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
30950 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
30960 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
30970 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
30980 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
30990 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
309a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
309b0 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
309c0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
309d0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
309e0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
309f0 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
30a00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30a10 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
30a20 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
30a30 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
30a40 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
30a50 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
30a60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
30a70 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
30a80 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
30a90 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
30aa0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
30ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
30ac0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
30ad0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
30ae0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
30af0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
30b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30b10 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
30b20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
30b30 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
30b40 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
30b50 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
30b60 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
30b70 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
30b80 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
30b90 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
30ba0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
30bb0 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
30bc0 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
30bd0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
30be0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
30bf0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
30c00 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
30c10 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
30c20 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
30c30 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
30c40 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
30c50 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
30c60 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
30c70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
30c80 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
30c90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
30ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
30cb0 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
30cc0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
30cd0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
30ce0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
30cf0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
30d00 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
30d10 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
30d20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
30d30 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
30d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
30d60 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
30d70 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
30d80 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
30d90 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
30da0 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
30db0 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
30dc0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
30dd0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
30de0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
30df0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
30e00 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
30e10 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
30e20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
30e30 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
30e40 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
30e50 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
30e60 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
30e70 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
30e80 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
30e90 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
30ea0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
30eb0 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
30ec0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
30ed0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
30ee0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
30ef0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
30f00 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
30f10 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
30f20 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
30f30 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
30f40 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
30f50 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
30f60 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
30f70 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
30f80 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
30f90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
30fa0 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
30fb0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
30fc0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
30fd0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
30fe0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
30ff0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
31000 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31020 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
31030 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
31040 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
31050 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
31060 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
31070 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
31080 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
31090 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
310a0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
310b0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
310c0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
310d0 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
310e0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
310f0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
31100 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
31110 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
31120 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
31130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
31140 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
31150 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
31160 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
31170 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
31180 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
31190 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
311a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
311b0 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
311c0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
311d0 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
311e0 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
311f0 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
31200 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
31210 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
31220 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
31230 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
31240 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
31250 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
31260 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
31270 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
31280 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
31290 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
312a0 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
312b0 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
312c0 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
312d0 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
312e0 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
312f0 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
31300 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
31310 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
31320 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
31330 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
31340 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
31350 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
31360 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
31370 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
31380 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
31390 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
313a0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
313b0 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
313c0 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
313d0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
313e0 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
31410 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
31420 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
31430 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
31440 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
31450 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
31460 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
31470 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
31480 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
31490 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
314a0 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
314b0 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
314c0 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
314d0 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
314e0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
314f0 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
31500 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
31510 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31520 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
31530 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
31540 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
31550 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
31560 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
31570 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
31580 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
31590 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
315a0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
315b0 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
315c0 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
315d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
315e0 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
315f0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
31600 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
31610 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
31620 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
31630 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
31640 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
31650 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
31660 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
31670 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
31680 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
31690 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
316a0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
316b0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
316c0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
316d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
316e0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
316f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
31700 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
31710 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
31720 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
31730 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31740 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
31750 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
31780 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
31790 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
317a0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
317b0 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
317c0 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
317d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
317e0 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
317f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31800 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
31810 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
31820 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
31830 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
31840 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
31850 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
31860 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
31870 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
31880 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31890 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
318a0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
318b0 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
318c0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
318d0 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
318e0 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
318f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
31900 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
31910 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
31920 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
31930 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
31940 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
31950 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
31960 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
31970 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
31980 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
31990 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
319a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
319b0 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
319c0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
319d0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
319e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
319f0 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
31a00 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
31a10 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
31a20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
31a30 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
31a40 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
31a50 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
31a60 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
31a70 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
31a80 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
31a90 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
31aa0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
31ab0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
31ac0 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
31ad0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
31ae0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
31af0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
31b00 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
31b10 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
31b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
31b30 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
31b40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
31b50 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
31b60 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
31b70 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
31b80 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
31b90 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
31ba0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
31bb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31bc0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
31bd0 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
31be0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31bf0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
31c00 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
31c10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
31c20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31c40 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31c50 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
31c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31c70 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
31c80 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
31c90 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
31ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31cb0 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
31cc0 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
31cd0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
31ce0 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
31cf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
31d00 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
31d10 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
31d20 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
31d30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
31d40 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
31d50 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
31d60 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
31d70 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
31d80 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
31d90 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
31da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
31db0 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
31dc0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
31dd0 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
31de0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
31df0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
31e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31e10 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
31e20 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
31e30 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
31e40 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
31e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31e60 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
31e70 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
31e80 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
31e90 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
31ea0 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
31eb0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
31ec0 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
31ed0 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
31ee0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
31ef0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
31f00 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
31f10 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
31f20 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
31f30 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
31f40 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
31f50 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
31f60 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
31f70 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
31f80 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
31f90 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
31fa0 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
31fb0 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
31fc0 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
31fd0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
31fe0 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
31ff0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
32000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
32010 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
32020 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
32030 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
32040 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
32050 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
32060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32070 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
32080 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
32090 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
320a0 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
320b0 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
320c0 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
320f0 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
32100 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32110 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
32120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
32130 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
32140 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
32150 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
32160 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
32170 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
32180 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
32190 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
321a0 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
321b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
321c0 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
321d0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
321e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
321f0 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
32200 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
32210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32220 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
32230 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
32240 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
32250 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
32260 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
32270 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
32280 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
322a0 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
322b0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
322c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
322d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
322e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
322f0 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
32300 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
32310 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32330 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
32340 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
32350 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
32360 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
32370 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
32380 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
32390 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
323a0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
323b0 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
323c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
323d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
323e0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
323f0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
32400 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
32410 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
32420 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
32430 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
32440 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
32450 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
32460 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
32470 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
32480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32490 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
324a0 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  gs ){.        if
324b0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
324c0 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
324d0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
324e0 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
324f0 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
32500 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
32510 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   -1;.        int
32520 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
32530 6e 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20  n(pCtx->dbPath, 
32540 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
32550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32560 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
32570 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
32580 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20  ISSIONS);.      
32590 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
325a0 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64  SPROXY: OPEN  %d
325b0 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20 20  \n", fd));.     
325c0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
325d0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
325e0 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20  >h = fd;.       
325f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32600 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54    rc=SQLITE_CANT
32610 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51  OPEN_BKPT; /* SQ
32620 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79  LITE_BUSY? proxy
32630 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64  TakeConch called
32640 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72 69  .           duri
32650 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ng locking */.  
32660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32680 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78  LITE_OK && !pCtx
32690 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ->lockProxy ){. 
326a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61 74         char *pat
326b0 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h = tempLockPath
326c0 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20   ? tempLockPath 
326d0 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  : pCtx->lockProx
326e0 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  yPath;.        r
326f0 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55  c = proxyCreateU
32700 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70  nixFile(path, &p
32710 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20  Ctx->lockProxy, 
32720 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
32730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
32740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
32750 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50  M && tryOldLockP
32760 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
32770 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20   /* we couldn't 
32780 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78 79  create the proxy
32790 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20   lock file with 
327a0 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c  the old lock fil
327b0 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
327c0 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69    ** so try agai
327d0 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e  n via auto-namin
327e0 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  g .           */
327f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63 65  .          force
32800 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  NewLockPath = 1;
32810 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c  .          tryOl
32820 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  dLockPath = 0;. 
32830 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
32840 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f  e; /* go back to
32850 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65   the do {} while
32860 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72   start point, tr
32870 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  y again */.     
32880 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
328a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
328b0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
328c0 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69  a copy of path i
328d0 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20 74  f we extracted t
328e0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
328f0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f    ** from the co
32900 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20  nch file or the 
32910 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74  path was allocat
32920 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a  ed on the stack.
32930 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
32940 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b      if( tempLock
32950 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
32960 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78    pCtx->lockProx
32970 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44  yPath = sqlite3D
32980 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c  bStrDup(0, tempL
32990 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ockPath);.      
329a0 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
329b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
329c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
329d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
329e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
329f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32a00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32a20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
32a30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 1;.        .  
32a40 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
32a50 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
32a60 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
32a70 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ods ){.         
32a80 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
32a90 78 74 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20  xt *afpCtx;.    
32aa0 20 20 20 20 20 20 61 66 70 43 74 78 20 3d 20 28        afpCtx = (
32ab0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
32ac0 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  t *)pCtx->lockPr
32ad0 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oxy->lockingCont
32ae0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ext;.          a
32af0 66 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20  fpCtx->dbPath = 
32b00 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
32b10 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ath;.        }. 
32b20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
32b30 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
32b40 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
32b50 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
32b60 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
32b70 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
32b80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41      OSTRACE(("TA
32b90 4b 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e  KECONCH  %d %s\n
32ba0 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
32bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f  rc==SQLITE_OK?"o
32bd0 6b 22 3a 22 66 61 69 6c 65 64 22 29 29 3b 0a 20  k":"failed"));. 
32be0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
32bf0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b      } while (1);
32c00 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
32c10 65 65 64 20 74 6f 20 72 65 74 72 79 20 74 68 65  eed to retry the
32c20 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c   :auto: lock fil
32c30 65 20 2d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e - .           
32c40 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
32c50 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
32c60 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
32c70 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
32c80 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
32c90 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
32ca0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
32cb0 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
32cc0 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
32cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32ce0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
32cf0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
32d00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32d10 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
32d20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
32d30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
32d40 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32d50 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
32d60 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
32d70 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
32d80 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
32d90 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
32da0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32db0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
32dc0 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
32dd0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
32de0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
32df0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
32e00 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
32e10 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
32e20 52 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f  RACE(("RELEASECO
32e30 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
32e40 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
32e50 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
32e60 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
32e70 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
32e80 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
32e90 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
32ea0 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
32eb0 29 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63  );.  if( pCtx->c
32ec0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
32ed0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
32ee0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
32ef0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
32f00 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f  *)conchFile, NO_
32f10 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74  LOCK);.  }.  pCt
32f20 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30  x->conchHeld = 0
32f30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
32f40 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25  LEASECONCH  %d %
32f50 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
32f60 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
32f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
32f80 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
32f90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
32fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
32fb0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
32fc0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d  tabase file, com
32fd0 70 75 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  pute the name of
32fe0 20 69 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e   its conch file.
32ff0 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f  .** Store the co
33000 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nch filename in 
33010 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
33020 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
33030 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a  loc()..** Make *
33040 70 43 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74  pConchPath point
33050 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65   to the new name
33060 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33070 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
33080 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
33090 4d 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f  M if unable to o
330a0 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  btain memory..**
330b0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
330c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
330d0 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
330e0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
330f0 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73  mory.** space is
33100 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
33110 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68  d..**.** *pConch
33120 50 61 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e  Path is set to N
33130 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  ULL if a memory 
33140 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
33150 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
33160 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
33170 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28  teConchPathname(
33180 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
33190 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29  ar **pConchPath)
331a0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
331d0 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d  r */.  int len =
331e0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
331f0 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20  ath); /* Length 
33200 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
33210 6e 61 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f  name - dbPath */
33220 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61  .  char *conchPa
33230 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
33240 20 2f 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68   /* buffer in wh
33250 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
33260 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a   conch name */..
33270 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
33280 61 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ace for the conc
33290 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  h filename and i
332a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61  nitialize the na
332b0 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  me to.  ** the n
332c0 61 6d 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ame of the origi
332d0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
332e0 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63  e. */  .  *pConc
332f0 68 50 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74  hPath = conchPat
33300 68 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  h = (char *)sqli
33310 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b  te3_malloc(len +
33320 20 38 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68   8);.  if( conch
33330 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Path==0 ){.    r
33340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33350 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  EM;.  }.  memcpy
33360 28 63 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61  (conchPath, dbPa
33370 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20  th, len+1);.  . 
33380 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61   /* now insert a
33390 20 22 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20   "." before the 
333a0 6c 61 73 74 20 2f 20 63 68 61 72 61 63 74 65 72  last / character
333b0 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65   */.  for( i=(le
333c0 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20  n-1); i>=0; i-- 
333d0 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68  ){.    if( conch
333e0 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  Path[i]=='/' ){.
333f0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
33400 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33410 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d  }.  conchPath[i]
33420 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20  ='.';.  while ( 
33430 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e  i<len ){.    con
33440 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61  chPath[i+1]=dbPa
33450 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a  th[i];.    i++;.
33460 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64    }..  /* append
33470 20 74 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75   the "-conch" su
33480 66 66 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65  ffix to the file
33490 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f   */.  memcpy(&co
334a0 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d  nchPath[i+1], "-
334b0 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73  conch", 7);.  as
334c0 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
334d0 6e 28 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20  n(conchPath) == 
334e0 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75  len+7 );..  retu
334f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
33500 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c  ../* Takes a ful
33510 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72  ly configured pr
33520 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  oxy locking-styl
33530 65 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20  e unix file and 
33540 73 77 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20  switches.** the 
33550 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
33560 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20  path .*/.static 
33570 69 6e 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72  int switchLockPr
33580 6f 78 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65  oxyPath(unixFile
33590 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
335a0 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
335b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
335c0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
335d0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
335e0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
335f0 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a  ontext;.  char *
33600 6f 6c 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e  oldPath = pCtx->
33610 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
33620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33630 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c  _OK;..  if( pFil
33640 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
33650 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
33660 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33670 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74  .  }  ..  /* not
33680 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74 68  hing to do if th
33690 65 20 70 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20  e path is NULL, 
336a0 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65  :auto: or matche
336b0 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 70  s the existing p
336c0 61 74 68 20 2a 2f 0a 20 20 69 66 28 20 21 70 61  ath */.  if( !pa
336d0 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27  th || path[0]=='
336e0 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70  \0' || !strcmp(p
336f0 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c  ath, ":auto:") |
33700 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74 68 20 26  |.    (oldPath &
33710 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61  & !strncmp(oldPa
33720 74 68 2c 20 70 61 74 68 2c 20 4d 41 58 50 41 54  th, path, MAXPAT
33730 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20 20 72 65  HLEN)) ){.    re
33740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
33760 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
33770 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
33780 78 79 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  xy;.    pCtx->lo
33790 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20  ckProxy=NULL;.  
337a0 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c    pCtx->conchHel
337b0 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c  d = 0;.    if( l
337c0 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29  ockProxy!=NULL )
337d0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50  {.      rc=lockP
337e0 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
337f0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
33800 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  ile *)lockProxy)
33810 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
33820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
33840 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d  ockProxy);.    }
33850 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33860 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20 20 20 20  e(oldPath);.    
33870 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33880 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
33890 74 72 44 75 70 28 30 2c 20 70 61 74 68 29 3b 0a  trDup(0, path);.
338a0 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
338b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69  rc;.}../*.** pFi
338c0 6c 65 20 69 73 20 61 20 66 69 6c 65 20 74 68 61  le is a file tha
338d0 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
338e0 64 20 62 79 20 61 20 70 72 69 6f 72 20 78 4f 70  d by a prior xOp
338f0 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50 61 74 68  en call.  dbPath
33900 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
33910 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
33920 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20 63 68 61  MAXPATHLEN+1 cha
33930 72 61 63 74 65 72 73 20 69 6e 20 73 69 7a 65 2e  racters in size.
33940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
33950 69 6e 65 20 66 69 6e 64 20 74 68 65 20 66 69 6c  ine find the fil
33960 65 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64  ename associated
33970 20 77 69 74 68 20 70 46 69 6c 65 20 61 6e 64 20   with pFile and 
33980 77 72 69 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74  writes it.** int
33990 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74   dbPath..*/.stat
339a0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44  ic int proxyGetD
339b0 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
339c0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
339d0 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29 7b  , char *dbPath){
339e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
339f0 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28 20 70 46  PPLE__).  if( pF
33a00 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20  ile->pMethod == 
33a10 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
33a20 0a 20 20 20 20 2f 2a 20 61 66 70 20 73 74 79 6c  .    /* afp styl
33a30 65 20 6b 65 65 70 73 20 61 20 72 65 66 65 72 65  e keeps a refere
33a40 6e 63 65 20 74 6f 20 74 68 65 20 64 62 20 70 61  nce to the db pa
33a50 74 68 20 69 6e 20 74 68 65 20 66 69 6c 65 50 61  th in the filePa
33a60 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a  th field .    **
33a70 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 20 2a   of the struct *
33a80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  /.    assert( (i
33a90 6e 74 29 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  nt)strlen((char*
33aa0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
33ab0 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
33ac0 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
33ad0 70 79 28 64 62 50 61 74 68 2c 20 28 28 61 66 70  py(dbPath, ((afp
33ae0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
33af0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
33b00 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61 74 68 2c  ontext)->dbPath,
33b10 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
33b20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
33b30 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
33b40 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  od == &dotlockIo
33b50 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
33b60 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65  * dot lock style
33b70 20 75 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e   uses the lockin
33b80 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
33b90 72 65 20 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a  re the dot lock.
33ba0 20 20 20 20 2a 2a 20 66 69 6c 65 20 70 61 74 68      ** file path
33bb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   */.    int len 
33bc0 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a  = strlen((char *
33bd0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
33be0 6f 6e 74 65 78 74 29 20 2d 20 73 74 72 6c 65 6e  ontext) - strlen
33bf0 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29  (DOTLOCK_SUFFIX)
33c00 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 50  ;.    memcpy(dbP
33c10 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
33c20 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
33c30 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20  xt, len + 1);.  
33c40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c  }else{.    /* al
33c50 6c 20 6f 74 68 65 72 20 73 74 79 6c 65 73 20 75  l other styles u
33c60 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  se the locking c
33c70 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
33c80 74 68 65 20 64 62 20 66 69 6c 65 20 70 61 74 68  the db file path
33c90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33ca0 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
33cb0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
33cc0 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
33cd0 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
33ce0 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
33cf0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
33d00 6e 74 65 78 74 2c 20 4d 41 58 50 41 54 48 4c 45  ntext, MAXPATHLE
33d10 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
33d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33d30 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c  *.** Takes an al
33d40 72 65 61 64 79 20 66 69 6c 6c 65 64 20 69 6e 20  ready filled in 
33d50 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 61 6c  unix file and al
33d60 74 65 72 73 20 69 74 20 73 6f 20 61 6c 6c 20 66  ters it so all f
33d70 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20  ile locking .** 
33d80 77 69 6c 6c 20 62 65 20 70 65 72 66 6f 72 6d 65  will be performe
33d90 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  d on the local p
33da0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20  roxy lock file. 
33db0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
33dc0 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20 70 72 65  ields.** are pre
33dd0 73 65 72 76 65 64 20 69 6e 20 74 68 65 20 6c 6f  served in the lo
33de0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f  cking context so
33df0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
33e00 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 0a  e restored and .
33e10 2a 2a 20 74 68 65 20 75 6e 69 78 20 73 74 72 75  ** the unix stru
33e20 63 74 75 72 65 20 70 72 6f 70 65 72 6c 79 20 63  cture properly c
33e30 6c 65 61 6e 65 64 20 75 70 20 61 74 20 63 6c 6f  leaned up at clo
33e40 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c  se time:.**  ->l
33e50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a  ockingContext.**
33e60 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73    ->pMethod.*/.s
33e70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
33e80 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
33e90 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
33ea0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
33eb0 74 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  th) {.  proxyLoc
33ec0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
33ed0 78 3b 0a 20 20 63 68 61 72 20 64 62 50 61 74 68  x;.  char dbPath
33ee0 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20  [MAXPATHLEN+1]; 
33ef0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
33f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33f10 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
33f20 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69  ckPath=NULL;.  i
33f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33f40 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46 69 6c  K;.  .  if( pFil
33f50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
33f60 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
33f70 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
33f80 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47 65 74 44  .  }.  proxyGetD
33f90 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65  bPathForUnixFile
33fa0 28 70 46 69 6c 65 2c 20 64 62 50 61 74 68 29 3b  (pFile, dbPath);
33fb0 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20  .  if( !path || 
33fc0 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c  path[0]=='\0' ||
33fd0 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22   !strcmp(path, "
33fe0 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20 20 20 20  :auto:") ){.    
33ff0 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20  lockPath=NULL;. 
34000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b   }else{.    lock
34010 50 61 74 68 3d 28 63 68 61 72 20 2a 29 70 61 74  Path=(char *)pat
34020 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f 53 54 52  h;.  }.  .  OSTR
34030 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
34040 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
34050 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
34060 0a 20 20 20 20 20 20 20 20 20 20 20 28 6c 6f 63  .           (loc
34070 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50 61 74 68  kPath ? lockPath
34080 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65   : ":auto:"), ge
34090 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 70 43 74  tpid()));..  pCt
340a0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
340b0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
340c0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d  ) );.  if( pCtx=
340d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
340e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
340f0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 74 78   }.  memset(pCtx
34100 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  , 0, sizeof(*pCt
34110 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 6f  x));..  rc = pro
34120 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
34130 68 6e 61 6d 65 28 64 62 50 61 74 68 2c 20 26 70  hname(dbPath, &p
34140 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
34150 74 68 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  th);.  if( rc==S
34160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34170 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
34180 55 6e 69 78 46 69 6c 65 28 70 43 74 78 2d 3e 63  UnixFile(pCtx->c
34190 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 70  onchFilePath, &p
341a0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2c 20  Ctx->conchFile, 
341b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
341c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
341d0 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f 70 65 6e  && ((pFile->open
341e0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
341f0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
34200 69 66 20 28 61 29 20 74 68 65 20 6f 70 65 6e 20  if (a) the open 
34210 66 6c 61 67 73 20 61 72 65 20 6e 6f 74 20 4f 5f  flags are not O_
34220 52 44 57 52 2c 20 28 62 29 20 74 68 65 20 63 6f  RDWR, (b) the co
34230 6e 63 68 20 69 73 6e 27 74 20 74 68 65 72 65 2c  nch isn't there,
34240 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 63   and.      ** (c
34250 29 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  ) the file syste
34260 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  m is read-only, 
34270 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c  then enable no-l
34280 6f 63 6b 69 6e 67 20 61 63 63 65 73 73 2e 0a 20  ocking access.. 
34290 20 20 20 20 20 2a 2a 20 55 67 68 2c 20 73 69 6e       ** Ugh, sin
342a0 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30  ce O_RDONLY==0x0
342b0 30 30 30 20 77 65 20 74 65 73 74 20 66 6f 72 20  000 we test for 
342c0 21 4f 5f 52 44 57 52 20 73 69 6e 63 65 20 75 6e  !O_RDWR since un
342d0 69 78 4f 70 65 6e 20 61 73 73 65 72 74 73 0a 20  ixOpen asserts. 
342e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 65       ** that ope
342f0 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68 61 76 65  nFlags will have
34300 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 4f 5f 52   only one of O_R
34310 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44 57 52 2e  DONLY or O_RDWR.
34320 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34330 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
34340 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
34350 63 74 20 73 74 61 74 20 63 6f 6e 63 68 49 6e 66  ct stat conchInf
34360 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 67 6f 4c  o;.      int goL
34370 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a 0a 20 20  ockless = 0;..  
34380 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 70      if( osStat(p
34390 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
343a0 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f 29 20  th, &conchInfo) 
343b0 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
343c0 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
343d0 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  o;.        if( (
343e0 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26 26 20  err==ENOENT) && 
343f0 28 73 74 61 74 66 73 28 64 62 50 61 74 68 2c 20  (statfs(dbPath, 
34400 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20  &fsInfo) != -1) 
34410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 4c  ){.          goL
34420 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49 6e 66  ockless = (fsInf
34430 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 52 44  o.f_flags&MNT_RD
34440 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f  ONLY) == MNT_RDO
34450 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NLY;.        }. 
34460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34470 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b 0a 20   goLockless ){. 
34480 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
34490 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20  chHeld = -1; /* 
344a0 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f  read only FS/ lo
344b0 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ckless */.      
344c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
344d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
344e0 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63 3d 3d    }  .  if( rc==
344f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 63  SQLITE_OK && loc
34500 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70 43 74  kPath ){.    pCt
34510 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34520 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
34530 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68 29 3b  up(0, lockPath);
34540 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
34550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34560 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
34570 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
34580 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 20 20  0, dbPath);.    
34590 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61 74 68  if( pCtx->dbPath
345a0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
345b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
345c0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  M;.    }.  }.  i
345d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
345e0 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6d   ){.    /* all m
345f0 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
34600 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65 20 63  ed, proxys are c
34610 72 65 61 74 65 64 20 61 6e 64 20 61 73 73 69 67  reated and assig
34620 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 77 69  ned, .    ** swi
34630 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  tch the locking 
34640 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
34650 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72 6e 2e  hod then return.
34660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 74 78  .    */.    pCtx
34670 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
34680 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ext = pFile->loc
34690 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
346a0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
346b0 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b 0a 20  ontext = pCtx;. 
346c0 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74     pCtx->pOldMet
346d0 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  hod = pFile->pMe
346e0 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c 65 2d  thod;.    pFile-
346f0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72 6f 78  >pMethod = &prox
34700 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  yIoMethods;.  }e
34710 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 74  lse{.    if( pCt
34720 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29 7b 20  x->conchFile ){ 
34730 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e  .      pCtx->con
34740 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
34750 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
34760 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e 63 6f  _file *)pCtx->co
34770 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
34780 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
34790 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  x->conchFile);. 
347a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
347b0 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
347c0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
347d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
347e0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
347f0 50 61 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69  Path); .    sqli
34800 74 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a  te3_free(pCtx);.
34810 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
34820 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25  TRANSPROXY  %d %
34830 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  s\n", pFile->h,.
34840 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
34850 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
34860 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
34870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34880 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34890 69 6e 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69  ine handles sqli
348a0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
348b0 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72  () calls that ar
348c0 65 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  e specific.** to
348d0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
348e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
348f0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
34900 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
34910 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
34920 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
34930 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
34940 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
34950 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
34960 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
34970 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
34980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  ;.      if( pFil
34990 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70  e->pMethod == &p
349a0 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b  roxyIoMethods ){
349b0 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f  .        proxyLo
349c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
349d0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
349e0 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65  ngContext*)pFile
349f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34a00 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 78 79 54  ;.        proxyT
34a10 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
34a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
34a30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28   ){.          *(
34a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
34a60 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  rg = pCtx->lockP
34a70 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
34a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34a90 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
34aa0 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f  **)pArg = ":auto
34ab0 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20  : (not held)";. 
34ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34ad0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
34ae0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
34af0 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pArg = NULL;.   
34b00 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
34b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
34b20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
34b30 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
34b40 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
34b50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
34b60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
34b70 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
34b80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
34b90 6e 74 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20  nt isProxyStyle 
34ba0 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  = (pFile->pMetho
34bb0 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
34bc0 68 6f 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28  hods);.      if(
34bd0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28   pArg==NULL || (
34be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
34bf0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
34c00 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
34c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
34c20 20 74 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20   turn off proxy 
34c30 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75  locking - not su
34c40 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20  pported */.     
34c50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34c60 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f  _ERROR /*SQLITE_
34c70 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45  PROTOCOL? SQLITE
34c80 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20  _MISUSE?*/;.    
34c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ca0 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
34cb0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
34cc0 20 61 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e   already off - N
34cd0 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOP */.         
34ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34cf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34d10 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78  const char *prox
34d20 79 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  yPath = (const c
34d30 68 61 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  har *)pArg;.    
34d40 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
34d50 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
34d60 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
34d70 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20  ntext *pCtx = . 
34d80 20 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 78             (prox
34d90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
34da0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34db0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
34dc0 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 70 41    if( !strcmp(pA
34dd0 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20  rg, ":auto:") . 
34de0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43            || (pC
34df0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34e00 68 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  h &&.           
34e10 20 20 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74      !strncmp(pCt
34e20 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34e30 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  , proxyPath, MAX
34e40 50 41 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20  PATHLEN)).      
34e50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
34e60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
34e70 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  K;.          }el
34e80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
34e90 72 63 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50  rc = switchLockP
34ea0 72 6f 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20  roxyPath(pFile, 
34eb0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
34ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34ee0 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78   /* turn on prox
34ef0 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  y file locking *
34f00 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
34f10 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
34f20 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70  nixFile(pFile, p
34f30 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20  roxyPath);.     
34f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34f50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34f60 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
34f70 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
34f80 20 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61   0 );  /* The ca
34f90 6c 6c 20 61 73 73 75 72 65 73 20 74 68 61 74 20  ll assures that 
34fa0 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64  only valid opcod
34fb0 65 73 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20  es are sent */. 
34fc0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
34fd0 52 45 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75  REACHED*/.  retu
34fe0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
34ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e  .}../*.** Within
35000 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28   this division (
35010 74 68 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  the proxying loc
35020 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
35030 69 6f 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75  ion) the procedu
35040 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69  res.** above thi
35050 73 20 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20  s point are all 
35060 75 74 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20  utilities.  The 
35070 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74  lock-related met
35080 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  hods of the.** p
35090 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c  roxy-locking sql
350a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f  ite3_io_method o
350b0 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f  bject follow..*/
350c0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
350d0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
350e0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
350f0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
35100 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
35110 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
35120 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
35130 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
35140 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
35150 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
35160 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
35170 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
35180 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
35190 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
351a0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
351b0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
351c0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
351d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
351e0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
351f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
35200 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
35210 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
35220 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
35230 74 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t) {.  unixFile 
35240 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
35250 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
35260 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
35270 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
35280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35290 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
352a0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
352b0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
352c0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
352d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
352e0 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
352f0 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
35300 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
35310 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
35320 6f 78 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72  oxy;.      retur
35330 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  n proxy->pMethod
35340 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  ->xCheckReserved
35350 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
35360 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f  le*)proxy, pResO
35370 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20  ut);.    }else{ 
35380 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30  /* conchHeld < 0
35390 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   is lockless */.
353a0 20 20 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b        pResOut=0;
353b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
353c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
353d0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
353e0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
353f0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
35400 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
35410 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
35420 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
35430 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
35440 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
35450 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
35460 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
35470 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
35480 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
35490 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
354a0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
354b0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
354c0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
354d0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
354e0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
354f0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
35500 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
35510 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
35520 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
35530 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
35540 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
35550 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
35560 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
35570 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
35580 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
35590 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
355a0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
355b0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
355c0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
355d0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
355e0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
355f0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
35600 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
35610 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
35620 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
35630 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
35640 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
35650 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
35660 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
35670 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
35680 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
35690 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
356a0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
356b0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
356c0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
356d0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
356e0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
356f0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
35700 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
35710 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
35720 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
35730 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
35740 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
35750 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f  rc = proxyTakeCo
35760 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  nch(pFile);.  if
35770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35780 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  ){.    proxyLock
35790 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
357a0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
357b0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
357c0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
357d0 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
357e0 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20  onchHeld>0 ){.  
357f0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72      unixFile *pr
35800 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
35810 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20  Proxy;.      rc 
35820 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  = proxy->pMethod
35830 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
35840 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46  _file*)proxy, eF
35850 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
35860 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
35870 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c   = proxy->eFileL
35880 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
35890 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65        /* conchHe
358a0 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
358b0 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  ss */.    }.  }.
358c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
358d0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
358e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
358f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
35900 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
35910 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
35920 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
35930 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
35940 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
35950 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
35960 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
35970 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
35980 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
35990 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
359a0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
359b0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
359c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
359d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
359e0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
359f0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
35a00 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
35a10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
35a20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
35a30 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
35a40 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
35a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35a60 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
35a70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
35a80 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
35a90 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
35aa0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
35ab0 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
35ac0 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
35ad0 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
35ae0 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
35af0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
35b00 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
35b10 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
35b20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78  lite3_file*)prox
35b30 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  y, eFileLock);. 
35b40 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
35b50 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65  eLock = proxy->e
35b60 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65  FileLock;.    }e
35b70 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f  lse{.      /* co
35b80 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c  nchHeld < 0 is l
35b90 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d  ockless */.    }
35ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
35bc0 20 61 20 66 69 6c 65 20 74 68 61 74 20 75 73 65   a file that use
35bd0 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a  s proxy locks..*
35be0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35bf0 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
35c00 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
35c10 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
35c20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
35c30 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
35c40 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35c50 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
35c60 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35c70 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
35c80 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75  ngContext;.    u
35c90 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
35ca0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
35cb0 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69  roxy;.    unixFi
35cc0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
35cd0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
35ce0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
35cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20  LITE_OK;.    .  
35d00 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20    if( lockProxy 
35d10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
35d20 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
35d30 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
35d40 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
35d50 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  xy, NO_LOCK);.  
35d60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35d70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
35d80 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d   = lockProxy->pM
35d90 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
35da0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63  qlite3_file*)loc
35db0 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
35dc0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35dd0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
35de0 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
35df0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f  ;.      pCtx->lo
35e00 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20  ckProxy = 0;.   
35e10 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68   }.    if( conch
35e20 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  File ){.      if
35e30 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
35e40 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  d ){.        rc 
35e50 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  = proxyReleaseCo
35e60 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nch(pFile);.    
35e70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35e80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
35e90 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68        rc = conch
35ea0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
35eb0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
35ec0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b  ile*)conchFile);
35ed0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
35ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f   sqlite3_free(co
35f00 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  nchFile);.    }.
35f10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35f20 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  e(0, pCtx->lockP
35f30 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73  roxyPath);.    s
35f40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
35f50 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29  ->conchFilePath)
35f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
35f70 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 64 62 50  ree(0, pCtx->dbP
35f80 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65 73  ath);.    /* res
35f90 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  tore the origina
35fa0 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  l locking contex
35fb0 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68  t and pMethod th
35fc0 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a 20  en close it */. 
35fd0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
35fe0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 2d  gContext = pCtx-
35ff0 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  >oldLockingConte
36000 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  xt;.    pFile->p
36010 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e 70  Method = pCtx->p
36020 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20 73  OldMethod;.    s
36030 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
36040 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 46  );.    return pF
36050 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  ile->pMethod->xC
36060 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  lose(id);.  }.  
36070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36080 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.}....#endif /*
36090 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
360a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
360b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
360c0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
360d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73 74  proxy locking st
360e0 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  yle is intended 
360f0 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46 50  for use with AFP
36100 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
36110 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20 69   And since AFP i
36120 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
36130 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65 20   on MacOSX, the 
36140 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
36150 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69 63   also.** restric
36160 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a  ted to MacOSX..*
36170 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  * .**.**********
36180 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
36190 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
361a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
361b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
361d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
361f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36210 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ****/../*.** Ini
36220 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
36230 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
36240 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erface..**.** Th
36250 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
36260 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d 70  ters all VFS imp
36270 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
36280 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72 61   unix-like opera
36290 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
362a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c 20    This routine, 
362b0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 5f  and the sqlite3_
362c0 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  os_end() routine
362d0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a   that follows,.*
362e0 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  * should be the 
362f0 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69 6e  only routines in
36300 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74 20   this file that 
36310 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d  are visible from
36320 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73 2e   other.** files.
36330 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
36340 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
36350 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ce during SQLite
36360 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
36370 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e 67  and by a.** sing
36380 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20  le thread.  The 
36390 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
363a0 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73  n and mutex subs
363b0 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74 0a  ystems have not.
363c0 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 62  ** necessarily b
363d0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
363e0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
363f0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e 64  e is called, and
36400 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75   so they.** shou
36410 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 0a  ld not be used..
36420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
36430 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20  s_init(void){ . 
36440 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66 6f   /* .  ** The fo
36450 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64 65  llowing macro de
36460 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c  fines an initial
36470 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c 69  izer for an sqli
36480 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
36490 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    ** The name of
364a0 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d 45   the VFS is NAME
364b0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 20  .  The pAppData 
364c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
364d0 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74  a pointer.  ** t
364e0 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20 66  o the "finder" f
364f0 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70 44  unction.  (pAppD
36500 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ata is a pointer
36510 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62 65   to a pointer be
36520 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c 79  cause.  ** silly
36530 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68 69   C90 rules prohi
36540 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f 6d  bit a void* from
36550 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20 61   being cast to a
36560 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
36570 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77 65  r.  ** and so we
36580 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72 6f   have to go thro
36590 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65 64  ugh the intermed
365a0 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  iate pointer to 
365b0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a 20  avoid problems. 
365c0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
365d0 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  ng with -pedanti
365e0 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43 2e  c-errors on GCC.
365f0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
36600 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65 72  FINDER parameter
36610 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
36620 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
36630 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
36640 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75 6e  .  ** finder-fun
36650 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e 64  ction.  The find
36660 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  er-function retu
36670 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
36680 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
36690 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
366a0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
366b0 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20 6c  ts the desired l
366c0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68 61  ocking.  ** beha
366d0 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65 20  viors.  See the 
366e0 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20 74  division above t
366f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
36700 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a 20   IOMETHODS.  ** 
36710 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74 69  macro for additi
36720 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  on information o
36730 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  n finder-functio
36740 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ns..  **.  ** Mo
36750 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70 6c  st finders simpl
36760 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  y return a point
36770 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
36780 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
36790 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 42  .  ** object.  B
367a0 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63 6b  ut the "autolock
367b0 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c 61  IoFinder" availa
367c0 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64 6f  ble on MacOSX do
367d0 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a 2a  es a little.  **
367e0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74 3b   more than that;
367f0 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65   it looks at the
36800 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
36810 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65 20   that hosts the 
36820 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
36830 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ile and tries to
36840 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b 69   choose an locki
36850 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f 70  ng method approp
36860 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 74  riate for.  ** t
36870 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20 74  hat filesystem t
36880 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ime..  */.  #def
36890 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53 4e  ine UNIXVFS(VFSN
368a0 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20 20  AME, FINDER) {  
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368c0 20 20 20 20 20 20 5c 0a 20 20 20 20 33 2c 20 20        \.    3,  
368d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368e0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
368f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36900 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f 66      \.    sizeof
36910 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20 20  (unixFile),     
36920 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20 20  /* szOsFile */  
36930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36940 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54 48    \.    MAX_PATH
36950 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f 2a  NAME,         /*
36960 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20   mxPathname */  
36970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36980 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  \.    0,        
36990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
369a0 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20 20  Next */         
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
369c0 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20 20      VFSNAME,    
369d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
369e0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
369f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
36a00 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45 52    (void*)&FINDER
36a10 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ,       /* pAppD
36a20 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ata */          
36a30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
36a40 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20 20  unixOpen,       
36a50 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
36a60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
36a70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
36a80 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  ixDelete,       
36a90 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
36aa0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
36ab0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
36ac0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
36ad0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 20    /* xAccess */ 
36ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36af0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46 75      \.    unixFu
36b00 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
36b10 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
36b20 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
36b30 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f 70    \.    unixDlOp
36b40 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
36b50 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20 20   xDlOpen */     
36b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b70 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72 6f  \.    unixDlErro
36b80 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
36b90 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  DlError */      
36ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
36bb0 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20 20      unixDlSym,  
36bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
36bd0 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20 20  Sym */          
36be0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
36bf0 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20 20    unixDlClose,  
36c00 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
36c10 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
36c20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
36c30 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c 20  unixRandomness, 
36c40 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
36c50 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ness */         
36c60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
36c70 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  ixSleep,        
36c80 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ca0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
36cb0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
36cc0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
36cd0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
36ce0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47 65      \.    unixGe
36cf0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
36d00 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
36d10 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
36d20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
36d30 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
36d40 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
36d50 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  64 */           
36d60 5c 0a 20 20 20 20 75 6e 69 78 53 65 74 53 79 73  \.    unixSetSys
36d70 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
36d80 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
36da0 20 20 20 20 75 6e 69 78 47 65 74 53 79 73 74 65      unixGetSyste
36db0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
36dc0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20  tSystemCall */  
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
36de0 20 20 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d    unixNextSystem
36df0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
36e00 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20  SystemCall */   
36e10 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
36e20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64  .  /*.  ** All d
36e30 65 66 61 75 6c 74 20 56 46 53 65 73 20 66 6f 72  efault VFSes for
36e40 20 75 6e 69 78 20 61 72 65 20 63 6f 6e 74 61 69   unix are contai
36e50 6e 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ned in the follo
36e60 77 69 6e 67 20 61 72 72 61 79 2e 0a 20 20 2a 2a  wing array..  **
36e70 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
36e80 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  the sqlite3_vfs.
36e90 70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 74  pNext field of t
36ea0 68 65 20 56 46 53 20 6f 62 6a 65 63 74 20 69 73  he VFS object is
36eb0 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a 2a 20 62   modified.  ** b
36ec0 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  y the SQLite cor
36ed0 65 20 77 68 65 6e 20 74 68 65 20 56 46 53 20 69  e when the VFS i
36ee0 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 20 53  s registered.  S
36ef0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
36f00 20 20 2a 2a 20 61 72 72 61 79 20 63 61 6e 6e 6f    ** array canno
36f10 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f  t be const..  */
36f20 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
36f30 33 5f 76 66 73 20 61 56 66 73 5b 5d 20 3d 20 7b  3_vfs aVfs[] = {
36f40 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
36f50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36f60 20 26 26 20 28 4f 53 5f 56 58 57 4f 52 4b 53 20   && (OS_VXWORKS 
36f70 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
36f80 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e 49 58 56  LE__)).    UNIXV
36f90 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20  FS("unix",      
36fa0 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69      autolockIoFi
36fb0 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65 0a 20 20  nder ),.#else.  
36fc0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
36fd0 2c 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 78  ,          posix
36fe0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
36ff0 69 66 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  if.    UNIXVFS("
37000 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20 20 20 20  unix-none",     
37010 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  nolockIoFinder )
37020 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37030 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c 20 20 64  nix-dotfile",  d
37040 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  otlockIoFinder )
37050 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ,.    UNIXVFS("u
37060 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20 20 20 70  nix-excl",     p
37070 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37080 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
37090 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
370a0 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49  -namedsem", semI
370b0 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
370c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
370d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
370e0 45 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  E.    UNIXVFS("u
370f0 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70  nix-posix",    p
37100 6f 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a  osixIoFinder ),.
37110 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
37120 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
37130 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f  x-flock",    flo
37140 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  ckIoFinder ),.#e
37150 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
37160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37170 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
37180 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
37190 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  ).    UNIXVFS("u
371a0 6e 69 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61  nix-afp",      a
371b0 66 70 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  fpIoFinder ),.  
371c0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
371d0 6e 66 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f  nfs",      nfsIo
371e0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
371f0 49 58 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78  IXVFS("unix-prox
37200 79 22 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69  y",    proxyIoFi
37210 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
37220 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
37230 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
37240 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
37250 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  /..  /* Register
37260 20 61 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e   all VFSes defin
37270 65 64 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d  ed in the aVfs[]
37280 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28   array */.  for(
37290 69 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61  i=0; i<(sizeof(a
372a0 56 66 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69  Vfs)/sizeof(sqli
372b0 74 65 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b  te3_vfs)); i++){
372c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
372d0 5f 72 65 67 69 73 74 65 72 28 26 61 56 66 73 5b  _register(&aVfs[
372e0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
372f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37300 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  K; .}../*.** Shu
37310 74 64 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74  tdown the operat
37320 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
37330 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  face..**.** Some
37340 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
37350 6d 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ms might need to
37360 20 64 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70   do some cleanup
37370 20 69 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   in this routine
37380 2c 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  ,.** to release 
37390 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
373a0 63 61 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20  cated objects.  
373b0 42 75 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e  But not on unix.
373c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
373d0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
373e0 75 6e 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  unix..*/.int sql
373f0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
37400 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
37410 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e  ITE_OK; .}. .#en
37420 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
37430 5f 55 4e 49 58 20 2a 2f 0a                       _UNIX */.