/ Hex Artifact Content
Login

Artifact 2ad4366b3c41dc813345d6dbb3cab97d62d60b96:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  .h>.#endif...#if
1170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1180: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1190: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
11a0: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
11b0: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11c0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11d0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11e0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11f0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
1200: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
1210: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1220: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1230: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1240: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1250: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1260: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1270: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1280: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1290: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
12a0: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
12b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45  dif..#ifdef HAVE
12c0: 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65  _UTIME.# include
12d0: 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69   <utime.h>.#endi
12e0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  f../*.** Allowed
12f0: 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46   values of unixF
1300: 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23  ile.fsFlags.*/.#
1310: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53  define SQLITE_FS
1320: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20  FLAGS_IS_MSDOS  
1330: 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66     0x1../*.** If
1340: 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68   we are to be th
1350: 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75  read-safe, inclu
1360: 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20  de the pthreads 
1370: 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e  header and defin
1380: 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  e.** the SQLITE_
1390: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
13a0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ro..*/.#if SQLIT
13b0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  E_THREADSAFE.# i
13c0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
13d0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  h>.# define SQLI
13e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
13f0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
1400: 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  Default permissi
1410: 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e  ons when creatin
1420: 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a  g a new file.*/.
1430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
1440: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
1450: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
1460: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1470: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
1480: 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0644.#endif../*
1490: 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72  . ** Default per
14a0: 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72  missions when cr
14b0: 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78  eating auto prox
14c0: 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65  y dir. */.#ifnde
14d0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
14e0: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
14f0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
1500: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
1510: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
1520: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
1530: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
1540: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1550: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1560: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1570: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1580: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1590: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
15a0: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
15b0: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
15c0: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
15d0: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
15e0: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
15f0: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1600: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1610: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
1620: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
1630: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
1640: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1650: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
1660: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
1670: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1680: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1690: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
16a0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
16b0: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
16c0: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
16d0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
16e0: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
16f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1700: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1710: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
1720: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
1730: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
1740: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
1750: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
1760: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1770: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1780: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1790: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
17a0: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
17b0: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
17c0: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
17d0: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
17e0: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
17f0: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1800: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1810: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
1820: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
1830: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
1840: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
1850: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
1860: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
1870: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1880: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1890: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
18a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
18d0: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
18e0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
18f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1900: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1910: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
1920: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
1930: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
1940: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
1950: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1960: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
1970: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1980: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1990: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
19a0: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
19b0: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
19c0: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
19d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
19e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19f0: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1a00: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1a10: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
1a20: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
1a30: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
1a40: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
1a50: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1a60: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1a90: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1aa0: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1ab0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ad0: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1ae0: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1af0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b20: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1b30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b40: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b60: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b70: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b90: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1ba0: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1bb0: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1bc0: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1bd0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1c00: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1c10: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1c20: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c30: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c40: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c50: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c60: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c70: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c90: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1ca0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1cc0: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1cd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ce0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cf0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1d20: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d30: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d40: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d70: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d80: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d90: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1da0: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1db0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dd0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1de0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1df0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1e00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1e10: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1e20: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e30: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e60: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e70: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e80: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e90: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1ec0: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ed0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1ee0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ef0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1f00: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1f10: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1f20: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f30: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f40: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f50: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f60: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f70: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f80: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1fa0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1fb0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1fc0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fd0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fe0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1ff0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2000: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2010: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2020: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2030: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2040: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2050: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2060: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2070: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2080: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2090: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
20a0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
20b0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
20c0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20d0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20e0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20f0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2100: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2110: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2120: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2130: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2140: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2150: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2160: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2170: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2180: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2190: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
21a0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
21b0: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
21c0: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21d0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21e0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21f0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
2200: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2210: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
2220: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2230: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2240: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2250: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2260: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2270: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2280: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2290: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
22a0: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
22b0: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
22c0: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
22d0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
22e0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22f0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
2300: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
2310: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
2320: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2330: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
2340: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2350: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2360: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2370: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2380: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2390: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
23a0: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
23b0: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
23c0: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
23d0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
23e0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23f0: 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  0.#endif.#define
2400: 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20   UNIXFILE_PSOW  
2410: 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f        0x10     /
2420: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
2430: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2440: 54 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  TE */../*.** Inc
2450: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
2460: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
2470: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
2480: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
2490: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65  mon.h"../*.** De
24a0: 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63  fine various mac
24b0: 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73  ros that are mis
24c0: 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73  sing from some s
24d0: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
24e0: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
24f0: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2500: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2510: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2520: 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f  LE_LFS.# undef O
2530: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2540: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2550: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
2560: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65   O_NOFOLLOW.# de
2570: 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20  fine O_NOFOLLOW 
2580: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
2590: 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69   O_BINARY.# defi
25a0: 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65  ne O_BINARY 0.#e
25b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
25c0: 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72  threadid macro r
25d0: 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74  esolves to the t
25e0: 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30  hread-id or to 0
25f0: 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74  .  Used for.** t
2600: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2610: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
2620: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
2630: 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65  AFE.#define thre
2640: 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c  adid pthread_sel
2650: 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  f().#else.#defin
2660: 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e  e threadid 0.#en
2670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65  dif../*.** Diffe
2680: 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d  rent Unix system
2690: 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29  s declare open()
26a0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61   in different wa
26b0: 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a  ys.  Same use.**
26c0: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
26d0: 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20  *,int,mode_t).  
26e0: 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28  Others use open(
26f0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2700: 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ...)..** The dif
2710: 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72  ference is impor
2720: 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20  tant when using 
2730: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2740: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2750: 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79 20   The safest way 
2760: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
2770: 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61   problem is to a
2780: 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20 77  lways use this w
2790: 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20  rapper.** which 
27a0: 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20 73  always has the s
27b0: 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64  ame well-defined
27c0: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
27d0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f  tatic int posixO
27e0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
27f0: 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  zFile, int flags
2800: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72  , int mode){.  r
2810: 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65  eturn open(zFile
2820: 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a  , flags, mode);.
2830: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2840: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2850: 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
2860: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ory(const char*,
2870: 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d   int*);../*.** M
2880: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2890: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
28a0: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
28b0: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
28c0: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
28d0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
28e0: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
28f0: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
2900: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
2910: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
2920: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2930: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2940: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2950: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2960: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2980: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2990: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
29a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
29b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
29c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
29d0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
29e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
29f0: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
2a00: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
2a10: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2a20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2a30: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2a40: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2a50: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2a60: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
2a70: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
2a80: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2a90: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
2aa0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
2ab0: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
2ac0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
2ad0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
2ae0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2af0: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
2b00: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2b10: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
2b20: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2b30: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
2b40: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
2b50: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
2b60: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
2b70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2b80: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
2b90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2ba0: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
2bb0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
2bc0: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
2bd0: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
2be0: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
2bf0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2c00: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
2c10: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2c20: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
2c30: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
2c40: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
2c50: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
2c60: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
2c70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2c80: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
2c90: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2ca0: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
2cb0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
2cc0: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
2cd0: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
2ce0: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
2cf0: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
2d00: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
2d10: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
2d20: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
2d30: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
2d40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
2d50: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
2d60: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
2d70: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
2d80: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
2d90: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
2da0: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
2db0: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
2dc0: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
2dd0: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
2de0: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
2df0: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
2e00: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
2e10: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2e20: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2e30: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
2e40: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
2e50: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
2e60: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2e70: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
2e80: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
2e90: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
2ea0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
2eb0: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
2ec0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2ed0: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
2ee0: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
2ef0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f00: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
2f10: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
2f20: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
2f30: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
2f40: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
2f50: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
2f60: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2f70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
2f80: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
2f90: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
2fa0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
2fb0: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
2fc0: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
2fd0: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
2fe0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
3000: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3010: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
3020: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3030: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3040: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
3050: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3060: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3070: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3080: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3090: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
30a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
30b0: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
30c0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
30d0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
30e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
30f0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3100: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3110: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
3120: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3130: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
3140: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3150: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
3160: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
3170: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
3180: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
3190: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
31a0: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
31b0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
31c0: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
31d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
31e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
31f0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3200: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
3210: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3220: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3230: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
3240: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3250: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
3260: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3270: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
3280: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3290: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
32a0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
32b0: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
32c0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
32d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
32e0: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
32f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
3300: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
3310: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3320: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3330: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
3340: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3350: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
3360: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3370: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3380: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3390: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
33a0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
33b0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
33c0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
33d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33e0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
33f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3400: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3410: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
3420: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3430: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3440: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
3450: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
3460: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
3470: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3480: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3490: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
34a0: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
34b0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
34c0: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
34d0: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
34f0: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3500: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3510: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3520: 53 54 59 4c 45 0a 20 20 7b 20 22 66 63 68 6d 6f  STYLE.  { "fchmo
3530: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3540: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3550: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
3560: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6d  .#else.  { "fchm
3570: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
3580: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3590: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
35a0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
35b0: 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69   osFchmod    ((i
35c0: 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74  nt(*)(int,mode_t
35d0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
35e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
35f0: 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
3600: 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
3610: 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
3620: 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61  ATE.  { "falloca
3630: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
3640: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
3650: 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30  ix_fallocate,  0
3660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
3670: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3680: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3690: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  tr)0,           
36a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
36b0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f  .#define osFallo
36c0: 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e  cate ((int(*)(in
36d0: 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61  t,off_t,off_t))a
36e0: 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72  Syscall[15].pCur
36f0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69  rent)..  { "unli
3700: 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  nk",       (sqli
3710: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3720: 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20  unlink,         
3730: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3740: 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74  sUnlink    ((int
3750: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3760: 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43  )aSyscall[16].pC
3770: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70  urrent)..  { "op
3780: 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20  enDirectory",   
3790: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
37a0: 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74  l_ptr)openDirect
37b0: 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ory,      0 },.#
37c0: 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72  define osOpenDir
37d0: 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28  ectory ((int(*)(
37e0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
37f0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70  ))aSyscall[17].p
3800: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d  Current)..  { "m
3810: 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  kdir",        (s
3820: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3830: 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20  tr)mkdir,       
3840: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3850: 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69   osMkdir     ((i
3860: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3870: 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  *,mode_t))aSysca
3880: 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[18].pCurrent)
3890: 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20  ..  { "rmdir",  
38a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
38b0: 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72  yscall_ptr)rmdir
38c0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
38d0: 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72  .#define osRmdir
38e0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
38f0: 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73 63  nst char*))aSysc
3900: 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74  all[19].pCurrent
3910: 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  )..}; /* End of 
3920: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
3930: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
3940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
3950: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
3960: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
3970: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
3980: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e  ll of the.** "un
3990: 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  ix" VFSes.  Retu
39a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
39b0: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
39c0: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
39d0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
39e0: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
39f0: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
3a00: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
3a10: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
3a20: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
3a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
3a40: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xSetSystemCall(.
3a50: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
3a60: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
3a70: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
3a80: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
3a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3aa0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
3ab0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
3ac0: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
3ad0: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
3ae0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
3af0: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
3b00: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
3b10: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
3b20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3b30: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
3b40: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
3b50: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3b60: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
3b70: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
3b80: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
3b90: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
3ba0: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
3bb0: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
3bc0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
3bd0: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
3be0: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
3bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
3c00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3c10: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
3c20: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
3c30: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
3c40: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
3c50: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
3c60: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3c70: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
3c80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3c90: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
3ca0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
3cb0: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
3cc0: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
3cd0: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
3ce0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
3cf0: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
3d00: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
3d10: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
3d20: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
3d30: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
3d40: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
3d50: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
3d60: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
3d70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
3d80: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3d90: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
3da0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
3db0: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
3dc0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
3dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3de0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
3df0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
3e00: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
3e10: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
3e20: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
3e30: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
3e40: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
3e50: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
3e60: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3e70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3e80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
3e90: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
3ea0: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
3eb0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3ec0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
3ed0: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
3ee0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
3ef0: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
3f00: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
3f10: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
3f20: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
3f30: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
3f40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f50: 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43  r unixGetSystemC
3f60: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
3f70: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
3f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3f90: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
3fa0: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
3fb0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
3fc0: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
3fd0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
3fe0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
3ff0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
4000: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4010: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4020: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
4030: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
4040: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
4050: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4060: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
4070: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
4080: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
4090: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
40a0: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
40b0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
40c0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
40d0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
40e0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
40f0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
4100: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
4110: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
4120: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
4130: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
4140: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
4150: 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78  st char *unixNex
4160: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
4170: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
4180: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
4190: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
41a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
41b0: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
41c0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
41d0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
41e0: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
41f0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4200: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4210: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4230: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
4240: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4250: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
4260: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
4270: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
4280: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
4290: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
42a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
42b0: 65 74 72 79 20 6f 70 65 6e 28 29 20 63 61 6c 6c  etry open() call
42c0: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
42d0: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
42e0: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
42f0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
4300: 2c 20 69 6e 74 20 66 2c 20 69 6e 74 20 6d 29 7b  , int f, int m){
4310: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
4320: 20 72 63 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   rc = osOpen(z,f
4330: 2c 6d 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ,m); }while( rc<
4340: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
4350: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
4360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
4370: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
4380: 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
4390: 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
43a0: 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
43b0: 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
43c0: 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
43d0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
43e0: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
43f0: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
4400: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
4410: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
4420: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
4430: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
4440: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
4450: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
4460: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
4470: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
4480: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
4490: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
44a0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
44b0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
44c0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
44d0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
44e0: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
44f0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
4500: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
4510: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
4520: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
4530: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
4540: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
4550: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
4560: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
4570: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
4580: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
4590: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
45a0: 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
45b0: 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d   void unixLeaveM
45c0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
45d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
45e0: 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
45f0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
4600: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
4610: 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
4620: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
4630: 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  nt unixMutexHeld
4640: 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
4650: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
4660: 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
4670: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
4680: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
4690: 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  R));.}.#endif...
46a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
46b0: 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
46c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
46d0: 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  )./*.** Helper f
46e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
46f0: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
4700: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4710: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
4720: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
4730: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
4740: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
4750: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
4760: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
4770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
4780: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
4790: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
47a0: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
47b0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
47c0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
47d0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
47e0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
47f0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
4800: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
4810: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
4820: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
4830: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
4840: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
4850: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
4860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
4870: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
4880: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
4890: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
48a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
48b0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
48c0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
48d0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
48e0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
48f0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
4900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4910: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
4920: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
4930: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
4940: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
4950: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
4960: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
4970: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
4980: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
4990: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
49a0: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
49b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
49c0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
49d0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
49e0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
49f0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
4a00: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
4a10: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
4a20: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
4a30: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
4a40: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
4a50: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
4a60: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
4a70: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
4a80: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
4a90: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
4aa0: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
4ab0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
4ac0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4ad0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
4ae0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
4af0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
4b00: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
4b10: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4b20: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
4b30: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
4b40: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
4b50: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
4b60: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
4b70: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
4b80: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
4b90: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4ba0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
4bb0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4bc0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
4bd0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
4be0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
4bf0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
4c00: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
4c10: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
4c20: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
4c30: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
4c40: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
4c50: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
4c60: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
4c70: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
4c80: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
4c90: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
4ca0: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
4cb0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
4cc0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
4cd0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
4ce0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
4cf0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
4d00: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
4d10: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
4d20: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
4d30: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
4d40: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
4d50: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
4d60: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
4d70: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
4d80: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
4d90: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
4da0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
4db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
4dc0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
4dd0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
4de0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
4df0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
4e00: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
4e10: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4e20: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
4e30: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
4e40: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
4e50: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
4e60: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
4e70: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
4e80: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
4e90: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
4ea0: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
4eb0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
4ec0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
4ed0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
4ee0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
4ef0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
4f00: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
4f10: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
4f20: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
4f30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
4f40: 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69  bust_ftruncate(i
4f50: 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e  nt h, sqlite3_in
4f60: 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72  t64 sz){.  int r
4f70: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
4f80: 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b  Ftruncate(h,sz);
4f90: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
4fa0: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4fb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4fc0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4fd0: 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61  ine translates a
4fe0: 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20   standard POSIX 
4ff0: 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20  errno code into 
5000: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65  something.** use
5010: 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ful to the clien
5020: 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ts of the sqlite
5030: 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70  3 functions.  Sp
5040: 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69  ecifically, it i
5050: 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f  s.** intended to
5060: 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72   translate a var
5070: 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61  iety of "try aga
5080: 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  in" errors into 
5090: 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61  SQLITE_BUSY.** a
50a0: 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  nd a variety of 
50b0: 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68  "please close th
50c0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
50d0: 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e  r NOW" errors in
50e0: 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  to .** SQLITE_IO
50f0: 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72  ERR.** .** Error
5100: 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  s during initial
5110: 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  ization of locks
5120: 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d  , or file system
5130: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63   support for loc
5140: 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61  ks,.** should ha
5150: 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f  ndle ENOLCK, ENO
5160: 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50  TSUP, EOPNOTSUPP
5170: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
5180: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
5190: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
51a0: 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72  rror(int posixEr
51b0: 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49  ror, int sqliteI
51c0: 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68  OErr) {.  switch
51d0: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
51e0: 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e  #if 0.  /* At on
51f0: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64  e point this cod
5200: 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e  e was not commen
5210: 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f  ted out. In theo
5220: 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a  ry, this branch.
5230: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65    ** should neve
5240: 72 20 62 65 20 68 69 74 2c 20 61 73 20 74 68 69  r be hit, as thi
5250: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
5260: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
5270: 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f   after.  ** a lo
5280: 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75  cking-related fu
5290: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e  nction (i.e. fcn
52a0: 74 6c 28 29 29 20 68 61 73 20 72 65 74 75 72 6e  tl()) has return
52b0: 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68  ed non-zero with
52c0: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
52d0: 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20  of errno as the 
52e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
52f0: 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63  Since a system c
5300: 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a  all has failed,.
5310: 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c    ** errno shoul
5320: 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20  d be non-zero.. 
5330: 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65   **.  ** Despite
5340: 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20   this, if errno 
5350: 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20  really is zero, 
5360: 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77  we still don't w
5370: 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20  ant to return.  
5380: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  ** SQLITE_OK. Th
5390: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61  e system call fa
53a0: 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a  iled, and *some*
53b0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68   SQLite error sh
53c0: 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f  ould be.  ** pro
53d0: 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20  pagated back to 
53e0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d  the caller. Comm
53f0: 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e  enting this bran
5400: 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72  ch out means err
5410: 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20  no==0.  ** will 
5420: 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
5430: 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73  e "default:" cas
5440: 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  e below..  */.  
5450: 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74  case 0: .    ret
5460: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
5470: 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41  endif..  case EA
5480: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
5490: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
54a0: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
54b0: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
54c0: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
54d0: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
54e0: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
54f0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
5500: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
5510: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
5520: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
5530: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
5540: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
5550: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5560: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43      .  case EACC
5570: 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43  ES: .    /* EACC
5580: 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49  ES is like EAGAI
5590: 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67  N during locking
55a0: 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74   operations, but
55b0: 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74   not any other t
55c0: 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73  ime*/.    if( (s
55d0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
55e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
55f0: 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45   || ..(sqliteIOE
5600: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
5610: 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09  RR_UNLOCK) || ..
5620: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
5630: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
5640: 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65  OCK) ||..(sqlite
5650: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5660: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
5670: 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VEDLOCK) ){.    
5680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5690: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
56a0: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72  /* else fall thr
56b0: 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45  ough */.  case E
56c0: 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72  PERM: .    retur
56d0: 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
56e0: 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b     .  /* EDEADLK
56f0: 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
5700: 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 66  e if a call to f
5710: 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69  cntl(F_SETLKW) i
5720: 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a  s made. And.  **
5730: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76   this module nev
5740: 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61 20  er makes such a 
5750: 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f  call. And the co
5760: 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74 73  de in SQLite its
5770: 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72 74  elf .  ** assert
5780: 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49 4f  s that SQLITE_IO
5790: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e  ERR_BLOCKED is n
57a0: 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20 46  ever returned. F
57b0: 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e 73  or these reasons
57c0: 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20  .  ** this case 
57d0: 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
57e0: 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73 79  d out. If the sy
57f0: 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65 72  stem does set er
5800: 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a  rno to EDEADLK,.
5810: 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74    ** the default
5820: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
5830: 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 72  X code will be r
5840: 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20  eturned. */.#if 
5850: 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b  0.  case EDEADLK
5860: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
5870: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
5880: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23  D;.#endif.    .#
5890: 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45  if EOPNOTSUPP!=E
58a0: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f  NOTSUP.  case EO
58b0: 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f  PNOTSUPP: .    /
58c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74  * something went
58d0: 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20   terribly awry, 
58e0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
58f0: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5900: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
5910: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5920: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
5930: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
5940: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
5950: 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  f ENOTSUP.  case
5960: 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f   ENOTSUP: .    /
5970: 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e  * invalid fd, un
5980: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
5990: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
59a0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69  introspection, i
59b0: 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20  n which .     * 
59c0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
59d0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
59e0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  /.#endif.  case 
59f0: 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44  EIO:.  case EBAD
5a00: 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c  F:.  case EINVAL
5a10: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e  :.  case ENOTCON
5a20: 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56  N:.  case ENODEV
5a30: 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a  :.  case ENXIO:.
5a40: 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23    case ENOENT:.#
5a50: 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20 20  ifdef ESTALE    
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f   /* ESTALE is no
5a80: 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74  t defined on Int
5a90: 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a  erix systems */.
5aa0: 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23    case ESTALE:.#
5ab0: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f  endif.  case ENO
5ac0: 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73  SYS:.    /* thes
5ad0: 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74  e should force t
5ae0: 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f  he client to clo
5af0: 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
5b00: 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20  reconnect */.   
5b10: 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20   .  default: .  
5b20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49    return sqliteI
5b30: 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f  OErr;.  }.}..../
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ba0: 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46  * Begin Unique F
5bb0: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
5bc0: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5be0: 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72  *.** On most ver
5bf0: 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77  sions of unix, w
5c00: 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71  e can get a uniq
5c10: 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65  ue ID for a file
5c20: 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e   by concatenatin
5c30: 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20  g.** the device 
5c40: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
5c50: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75  node number.  Bu
5c60: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  t this does not 
5c70: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
5c80: 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20  .** On VxWorks, 
5c90: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64  a unique file id
5ca0: 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20 6f   must be based o
5cb0: 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  n the canonical 
5cc0: 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  filename..**.** 
5cd0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  A pointer to an 
5ce0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5cf0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5d00: 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ure can be used 
5d10: 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66  as a.** unique f
5d20: 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b  ile ID in VxWork
5d30: 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63  s.  Each instanc
5d40: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
5d50: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ure contains.** 
5d60: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
5d70: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
5d80: 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  .  There is also
5d90: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
5da0: 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72  nt.  .** The str
5db0: 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61 69  ucture is reclai
5dc0: 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  med when the num
5dd0: 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ber of pointers 
5de0: 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a  to it drops to.*
5df0: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
5e00: 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76 65  ere are never ve
5e10: 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70  ry many files op
5e20: 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61  en at one time a
5e30: 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e  nd lookups are n
5e40: 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61  ot.** a performa
5e50: 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74  nce-critical pat
5e60: 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66 66  h, so it is suff
5e70: 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68  icient to put th
5e80: 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ese.** structure
5e90: 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s on a linked li
5ea0: 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78  st..*/.struct vx
5eb0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20  worksFileId {.  
5ec0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
5ed0: 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a  leId *pNext;  /*
5ee0: 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20   Next in a list 
5ef0: 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20  of them all */. 
5f00: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
5f30: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f  rences to this o
5f40: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ne */.  int nNam
5f50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5f60: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
5f70: 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61  of the zCanonica
5f80: 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a  lName[] string *
5f90: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e  /.  char *zCanon
5fa0: 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20  icalName;       
5fb0: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66    /* Canonical f
5fc0: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23  ilename */.};..#
5fd0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
5fe0: 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20   .** All unique 
5ff0: 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65  filenames are he
6000: 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  ld on a linked l
6010: 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74 68  ist headed by th
6020: 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a  is.** variable:.
6030: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
6040: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6050: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
6060: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70  = 0;../*.** Simp
6070: 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20  lify a filename 
6080: 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63  into its canonic
6090: 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61  al form.** by ma
60a0: 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  king the followi
60b0: 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a  ng changes:.**.*
60c0: 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e  *  * removing an
60d0: 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64  y trailing and d
60e0: 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a  uplicate /.**  *
60f0: 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74   convert /./ int
6100: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63  o just /.**  * c
6110: 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68  onvert /A/../ wh
6120: 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d  ere A is any sim
6130: 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75  ple name into ju
6140: 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  st /.**.** Chang
6150: 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70  es are made in-p
6160: 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68  lace.  Return th
6170: 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74  e new name lengt
6180: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  h..**.** The ori
6190: 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
61a0: 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20  s in z[0..n-1]. 
61b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
61c0: 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  er of.** charact
61d0: 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c  ers in the simpl
61e0: 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ified name..*/.s
61f0: 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b  tatic int vxwork
6200: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68  sSimplifyName(ch
6210: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6220: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69   int i, j;.  whi
6230: 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31  le( n>1 && z[n-1
6240: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
6250: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
6260: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6270: 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20   z[i]=='/' ){.  
6280: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6290: 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
62a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
62b0: 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26  =='.' && i+2<n &
62c0: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  & z[i+2]=='/' ){
62d0: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b  .        i += 1;
62e0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
62f0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6300: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27   if( z[i+1]=='.'
6310: 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69   && i+3<n && z[i
6320: 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b  +2]=='.' && z[i+
6330: 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
6340: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
6350: 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20   z[j-1]!='/' ){ 
6360: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
6370: 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d  f( j>0 ){ j--; }
6380: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b  .        i += 2;
6390: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
63a0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
63b0: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b  .    z[j++] = z[
63c0: 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d  i];.  }.  z[j] =
63d0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a   0;.  return j;.
63e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
63f0: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  unique file ID f
6400: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62 73  or the given abs
6410: 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20  olute pathname. 
6420: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
6430: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f  nter to the vxwo
6440: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
6450: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20  .  This pointer 
6460: 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a  is the unique.**
6470: 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20   file ID..**.** 
6480: 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f  The nRef field o
6490: 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c  f the vxworksFil
64a0: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  eId object is in
64b0: 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  cremented before
64c0: 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69  .** the object i
64d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e  s returned.  A n
64e0: 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ew vxworksFileId
64f0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
6500: 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20  ed.** and added 
6510: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69  to the global li
6520: 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  st if necessary.
6530: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
6540: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6550: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
6560: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
6570: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
6580: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
6590: 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74  FindFileId(const
65a0: 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65   char *zAbsolute
65b0: 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Name){.  struct 
65c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
65d0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  New;         /* 
65e0: 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e  search key and n
65f0: 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20  ew file ID */.  
6600: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6610: 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65  leId *pCandidate
6620: 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ;   /* For loopi
6630: 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67  ng over existing
6640: 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69   file IDs */.  i
6650: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
6680: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74  zAbsoluteName st
6690: 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ring */..  asser
66a0: 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  t( zAbsoluteName
66b0: 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20  [0]=='/' );.  n 
66c0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41  = (int)strlen(zA
66d0: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20  bsoluteName);.  
66e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
66f0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
6700: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
6710: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
6720: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
6730: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6740: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
6750: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
6760: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
6770: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
6780: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
6790: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
67a0: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
67b0: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
67c0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
67d0: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
67e0: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
67f0: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
6800: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
6810: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
6820: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
6830: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6840: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
6850: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
6860: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
6870: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
6880: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
6890: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
68a0: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
68b0: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
68c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
68d0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
68e0: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
68f0: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
6900: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
6910: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
6920: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
6930: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
6940: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
6950: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
6960: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
6970: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
6980: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
6990: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
69a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
69b0: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
69c0: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
69d0: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
69e0: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
69f0: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
6a00: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
6a10: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
6a20: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
6a30: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
6a40: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6a50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
6a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
6a70: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
6a80: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
6a90: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
6aa0: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
6ab0: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
6ac0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6ad0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
6ae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
6af0: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
6b00: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
6b10: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
6b20: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
6b30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
6b40: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
6b50: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
6b60: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
6b70: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
6b80: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
6b90: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
6ba0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
6bb0: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
6bc0: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
6bd0: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
6be0: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
6bf0: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
6c00: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
6c10: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
6c20: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
6c30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
6c40: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
6c60: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
6c70: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
6c80: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
6d60: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
6d70: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6d90: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
6da0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
6db0: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
6dc0: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
6dd0: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
6de0: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
6df0: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
6e00: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
6e10: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
6e20: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
6e30: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
6e40: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
6e50: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
6e60: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
6e70: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
6e80: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
6e90: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
6ea0: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
6eb0: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
6ec0: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
6ed0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
6ee0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
6ef0: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
6f00: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
6f10: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
6f20: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
6f30: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
6f40: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
6f50: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
6f60: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
6f70: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
6f80: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
6f90: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
6fa0: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
6fb0: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
6fc0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
6fd0: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
6fe0: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
6ff0: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7000: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7010: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7020: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
7030: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
7040: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
7050: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
7060: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
7070: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
7080: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7090: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
70a0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
70b0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
70c0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
70d0: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
70e0: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
70f0: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7100: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7110: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7120: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7130: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7140: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7150: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7160: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7170: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7180: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7190: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
71a0: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
71b0: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
71c0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
71d0: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
71e0: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
71f0: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7200: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7210: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7220: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7230: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7240: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7250: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7260: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7270: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7280: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7290: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
72a0: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
72b0: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
72c0: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
72d0: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
72e0: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
72f0: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7300: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7310: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7320: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7330: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7340: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7350: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7360: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7370: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7380: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7390: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
73a0: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
73b0: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
73c0: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
73d0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
73e0: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
73f0: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7400: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7410: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7420: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7430: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7440: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7450: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7460: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7470: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7480: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7490: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
74a0: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
74b0: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
74c0: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
74d0: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
74e0: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
74f0: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
7500: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
7510: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
7520: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
7530: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
7540: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
7550: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
7560: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
7570: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
7580: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
7590: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
75a0: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
75b0: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
75c0: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
75d0: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
75e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
75f0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7600: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
7610: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
7620: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
7630: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
7640: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
7650: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7660: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
7670: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
7680: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
7690: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
76a0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
76b0: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
76c0: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
76d0: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
76e0: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
76f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
7700: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
7710: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
7720: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7730: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
7740: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
7750: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
7760: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
7770: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
7780: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
7790: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
77a0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
77b0: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
77c0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
77d0: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
77e0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
77f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
7800: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
7810: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
7820: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
7830: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
7840: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
7850: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
7860: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
7870: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
7880: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
7890: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
78a0: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
78b0: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
78c0: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
78d0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
78e0: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
78f0: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
7900: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
7910: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
7920: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
7930: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
7940: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
7950: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
7960: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
7970: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
7980: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
7990: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
79a0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
79b0: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
79c0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
79d0: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
79e0: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
79f0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
7a00: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
7a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
7a20: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
7a30: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
7a40: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
7a50: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
7a60: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
7a70: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
7a80: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
7a90: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
7aa0: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
7ab0: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
7ac0: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
7ad0: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
7ae0: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
7af0: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
7b00: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
7b10: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
7b20: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
7b30: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
7b40: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
7b50: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
7b60: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
7b70: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
7b80: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
7b90: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
7ba0: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
7bb0: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
7bc0: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
7bd0: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
7be0: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
7bf0: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
7c00: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
7c10: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
7c20: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
7c30: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
7c40: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
7c50: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
7c60: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
7c70: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
7c80: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
7c90: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
7ca0: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
7cb0: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
7cc0: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
7cd0: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
7ce0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
7cf0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
7d00: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
7d10: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
7d20: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
7d30: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
7d40: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
7d50: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
7d60: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
7d70: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
7d80: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
7d90: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
7da0: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
7db0: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
7dc0: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
7dd0: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
7de0: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
7df0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7e00: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
7e10: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
7e20: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
7e30: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
7e40: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
7e50: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
7e60: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
7e70: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
7e80: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
7e90: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
7ea0: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
7eb0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
7ec0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
7ed0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
7ee0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
7ef0: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
7f00: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
7f10: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
7f20: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
7f30: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
7f40: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
7f50: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
7f60: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
7f70: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
7f80: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
7f90: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
7fa0: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
7fb0: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
7fc0: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
7fd0: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
7fe0: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
7ff0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8000: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8010: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8020: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
8030: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8040: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8050: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
8060: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
8070: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
8080: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8090: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
80a0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
80b0: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
80e0: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
80f0: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8100: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8110: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8120: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8130: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8140: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8160: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8170: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8180: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8190: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
81a0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
81b0: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
81c0: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
81d0: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
81e0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
81f0: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8200: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8210: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8220: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8230: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8240: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8250: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8260: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8270: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8280: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8290: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
82a0: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
82b0: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
82c0: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
82d0: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
82e0: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
82f0: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8300: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8310: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8320: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8330: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8340: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8350: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8370: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8380: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8390: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
83a0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
83b0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
83c0: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
83d0: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
83e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
83f0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8400: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8410: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8420: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8430: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8450: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8460: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8470: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8480: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8490: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
84a0: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
84b0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
84c0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
84d0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
84e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
84f0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
8500: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
8510: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8520: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
8530: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
8540: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
8550: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
8560: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
8570: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8580: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
8590: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
85a0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
85b0: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
85c0: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
85d0: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
85e0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
85f0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8600: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
8610: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
8620: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
8630: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
8640: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
8650: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8660: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
8690: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
86a0: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
86b0: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
86c0: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
86d0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
86e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
86f0: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
8700: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
8720: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
8730: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
8740: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8750: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
8760: 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  _x(), is only ev
8770: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
8780: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
8790: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
87a0: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
87b0: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
87c0: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
87d0: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
87e0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
87f0: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
8800: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
8810: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
8820: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
8830: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
8840: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
8850: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
8860: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
8870: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
8880: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
8890: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
88a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
88b0: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
88c0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
88d0: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
88e0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
88f0: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
8900: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
8910: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
8920: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
8930: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
8940: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
8950: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
8960: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
8970: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
8980: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
8990: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
89a0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
89b0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
89c0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
89d0: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
89e0: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
89f0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
8a00: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
8a10: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
8a20: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
8a30: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
8a60: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
8a70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a90: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
8aa0: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
8ab0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8ac0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
8ad0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
8ae0: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
8af0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
8b00: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b20: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
8b30: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
8b40: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
8b50: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
8b80: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
8b90: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
8ba0: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
8bb0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
8bc0: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
8bd0: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
8be0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8bf0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
8c00: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
8c10: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
8c20: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
8c30: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
8c40: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
8c50: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
8c60: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
8c70: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
8c80: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
8c90: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
8ca0: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
8cb0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
8cc0: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
8cd0: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
8ce0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
8cf0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
8d00: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
8d10: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
8d20: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
8d30: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
8d40: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
8d50: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
8d60: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
8d70: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
8d80: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
8d90: 64 65 73 20 74 68 65 20 74 68 65 20 47 4e 55 20  des the the GNU 
8da0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
8db0: 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20  ror_r() that .  
8dc0: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
8dd0: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
8e00: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
8e10: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
8e20: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
8e30: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
8e40: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
8e50: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
8e60: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
8e70: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
8e80: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
8e90: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
8ea0: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
8eb0: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
8ec0: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
8ed0: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
8ee0: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
8ef0: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
8f00: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
8f10: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
8f20: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
8f30: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
8f40: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
8f50: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
8f60: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
8f70: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
8f80: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
8f90: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
8fa0: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
8fb0: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
8fc0: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
8fd0: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
8fe0: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
8ff0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
9000: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
9010: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
9020: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
9030: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
9040: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
9050: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
9060: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
9070: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
9080: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
9090: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
90a0: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
90b0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
90c0: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
90d0: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
90e0: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
90f0: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
9100: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
9110: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
9120: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9130: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
9140: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
9150: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
9160: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
9170: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
9180: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
9190: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
91a0: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
91b0: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
91c0: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
91d0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
91e0: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
91f0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
9200: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
9210: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
9220: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
9230: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
9240: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
9250: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
9260: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
9270: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
9280: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
9290: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
92a0: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
92b0: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
92c0: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
92d0: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
92e0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
92f0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
9300: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
9310: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
9320: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
9330: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
9340: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
9350: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
9360: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
9370: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
9380: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
9390: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
93a0: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
93b0: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
93c0: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
93d0: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
93e0: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
93f0: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
9400: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
9410: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
9420: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9430: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
9440: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
9470: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
9480: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
9490: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
94a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
94b0: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
94c0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
94d0: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
94e0: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
94f0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9500: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9510: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9520: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9530: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9540: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9550: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9560: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9570: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9580: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9590: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
95a0: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
95b0: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
95c0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
95d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
95e0: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
95f0: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
9600: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
9610: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
9620: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
9630: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
9640: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
9650: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
9660: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
9670: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
9680: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
9690: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
96a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
96b0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
96c0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
96d0: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
96e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
96f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
9700: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
9710: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
9720: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
9730: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
9740: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
9750: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
9760: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
9770: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
9780: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
9790: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
97a0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
97b0: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
97c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
97d0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
97e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
97f0: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
9800: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
9810: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
9820: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
9830: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
9840: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9850: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
9860: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
9870: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
9880: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
9890: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
98a0: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
98b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
98c0: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
98d0: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
98e0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
98f0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
9900: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
9910: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9920: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
9930: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9940: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
9950: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
9960: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
9970: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
9980: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
9990: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
99a0: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
99b0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
99c0: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
99d0: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
99e0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
99f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9a00: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
9a10: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
9a20: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
9a30: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
9a40: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
9a50: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
9a60: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
9a70: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
9a80: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
9a90: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
9aa0: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
9ab0: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
9ac0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
9ad0: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
9ae0: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
9af0: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
9b00: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9b10: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
9b20: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
9b30: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
9b40: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
9b50: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
9b80: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
9b90: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
9bc0: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
9bd0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
9be0: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
9bf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
9c00: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
9c10: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
9c20: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
9c30: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
9c40: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
9c50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
9c60: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9c70: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
9c80: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
9c90: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9ca0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
9cb0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
9cc0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
9cd0: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
9ce0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
9cf0: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
9d00: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
9d10: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
9d20: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
9d30: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
9d40: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
9d50: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
9d60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
9d70: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
9d80: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
9d90: 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a  ifdef EOVERFLOW.
9da0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
9db0: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
9dc0: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
9dd0: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
9de0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
9df0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
9e00: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
9e10: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
9e20: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
9e30: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
9e40: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
9e50: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
9e60: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
9e70: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
9e80: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
9e90: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
9ea0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
9eb0: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
9ec0: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
9ed0: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
9ee0: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
9ef0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
9f00: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
9f10: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
9f20: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
9f30: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
9f40: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
9f50: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
9f60: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
9f70: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
9f80: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
9f90: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
9fa0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
9fb0: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
9fc0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
9fd0: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
9fe0: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
9ff0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
a000: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
a010: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
a020: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
a030: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
a040: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
a050: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
a060: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
a070: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
a080: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
a090: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
a0a0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
a0b0: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
a0c0: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
a0d0: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
a0e0: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
a0f0: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
a100: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
a110: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a120: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a140: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
a150: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
a160: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
a170: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
a180: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a190: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a1a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a1b0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
a1c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
a1d0: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
a1e0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
a1f0: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
a200: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
a210: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
a220: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
a230: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
a240: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
a250: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
a260: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
a270: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
a280: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
a290: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
a2a0: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
a2b0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
a2c0: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
a2d0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
a2e0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
a2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
a300: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
a310: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
a320: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
a330: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
a340: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a350: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
a360: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
a370: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
a380: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
a390: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
a3a0: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
a3b0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
a3c0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
a3d0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
a3e0: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
a3f0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
a400: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
a410: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
a420: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
a430: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
a440: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
a450: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
a460: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
a470: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
a480: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
a490: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
a4a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
a4b0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
a4c0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
a4d0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
a4e0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
a4f0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
a500: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
a510: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
a520: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
a530: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
a540: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
a550: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
a560: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
a570: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
a580: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
a590: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
a5a0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
a5b0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
a5c0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
a5d0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
a5e0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
a5f0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
a600: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
a610: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a620: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
a630: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
a640: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
a650: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
a660: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
a670: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a680: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
a690: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
a6a0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
a6b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
a6c0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
a6d0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
a6e0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
a6f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
a700: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
a710: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
a720: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
a730: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
a740: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
a750: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
a760: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
a770: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
a780: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
a790: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
a7a0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
a7b0: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
a7c0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
a7d0: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
a7e0: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
a7f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
a800: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
a810: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
a820: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
a830: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
a840: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
a850: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
a860: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
a870: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
a880: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
a890: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
a8a0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
a8b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
a8c0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
a8d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
a8e0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
a8f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
a900: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
a910: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  NLCK ){.      re
a920: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
a930: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
a940: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
a950: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
a960: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
a970: 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  %d %d (unix)\n",
a980: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
a990: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
a9a0: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
a9b0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
a9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
a9d0: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
a9e0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
a9f0: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
aa00: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
aa10: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
aa20: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
aa30: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
aa40: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
aa50: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
aa60: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
aa70: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
aa80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
aa90: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
aaa0: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
aab0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
aac0: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
aad0: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
aae0: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
aaf0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
ab00: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
ab10: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
ab20: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
ab30: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
ab40: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
ab50: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
ab60: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
ab70: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
ab80: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
ab90: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
aba0: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
abb0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
abc0: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
abd0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
abe0: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
abf0: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
ac00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac10: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
ac20: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
ac30: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
ac40: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
ac50: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
ac60: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
ac70: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
ac80: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
ac90: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
aca0: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
acb0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
acc0: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
acd0: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
ace0: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
acf0: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
ad00: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
ad10: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
ad20: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
ad30: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
ad40: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
ad50: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
ad60: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
ad70: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
ad80: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
ad90: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
ada0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
adb0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
adc0: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
add0: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
ade0: 20 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74   if( ((pFile->ct
adf0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
ae00: 4c 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70  LE_EXCL)!=0 || p
ae10: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
ae20: 6f 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69  ock).   && ((pFi
ae30: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
ae40: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
ae50: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ==0).  ){.    if
ae60: 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
ae70: 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
ae80: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
ae90: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
aea0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
aeb0: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f  k==0 );.      lo
aec0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
aed0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
aee0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
aef0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
af00: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
af10: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
af20: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
af30: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63  _WRLCK;.      rc
af40: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
af50: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
af60: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
af70: 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63  rc<0 ) return rc
af80: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
af90: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31  bProcessLock = 1
afa0: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
afb0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nLock++;.    }el
afc0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  se{.      rc = 0
afd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
afe0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
aff0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b000: 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d  TLK, pLock);.  }
b010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b020: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
b030: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
b040: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
b050: 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
b060: 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
b070: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b080: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
b090: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
b0a0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
b0b0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
b0c0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
b0d0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
b0e0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
b0f0: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
b100: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
b110: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
b120: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
b130: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
b140: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
b150: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
b160: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
b170: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
b180: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
b190: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
b1a0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
b1b0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
b1c0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
b1d0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
b1e0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
b1f0: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
b200: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
b210: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
b220: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
b230: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
b240: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
b250: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
b260: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
b270: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
b280: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
b290: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
b2a0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
b2b0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
b2c0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
b2d0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
b2e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
b2f0: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
b300: 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
b310: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
b320: 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
b330: 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
b340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b350: 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33  unixLock(sqlite3
b360: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
b370: 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20  FileLock){.  /* 
b380: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
b390: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
b3a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
b3b0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
b3c0: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
b3d0: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
b3e0: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
b3f0: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
b400: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
b410: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
b420: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
b430: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
b440: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
b450: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
b460: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
b470: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
b480: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
b490: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
b4a0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
b4b0: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
b4c0: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
b4d0: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
b4e0: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
b4f0: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
b500: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
b510: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
b520: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
b530: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
b540: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
b550: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
b560: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
b570: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
b580: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
b590: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
b5a0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
b5b0: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
b5c0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
b5d0: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
b5e0: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
b5f0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
b600: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
b610: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
b620: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
b630: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
b640: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
b650: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
b660: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
b670: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
b680: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
b690: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
b6a0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
b6b0: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
b6c0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
b6d0: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
b6e0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
b6f0: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
b700: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
b710: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
b720: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
b730: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
b740: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
b750: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
b760: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
b770: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
b780: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
b790: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
b7a0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
b7b0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
b7c0: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
b7d0: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
b7e0: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
b7f0: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
b800: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
b810: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
b820: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
b830: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
b840: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
b850: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
b860: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
b870: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
b880: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
b890: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
b8a0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
b8b0: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
b8c0: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
b8d0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
b8e0: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
b8f0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
b900: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
b910: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
b920: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
b930: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
b940: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
b950: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
b960: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
b970: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
b980: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
b990: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
b9a0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
b9b0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
b9c0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
b9d0: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
b9e0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
b9f0: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
ba00: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
ba10: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
ba20: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
ba30: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
ba40: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
ba50: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
ba60: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
ba70: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
ba80: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
ba90: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
baa0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
bab0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
bac0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
bad0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
bae0: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
baf0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
bb00: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
bb10: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
bb20: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
bb30: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
bb40: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
bb50: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
bb60: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
bb70: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
bb80: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
bb90: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
bba0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
bbb0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
bbc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bbd0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
bbe0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
bbf0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
bc00: 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75   *pInode;.  stru
bc10: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
bc20: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b   int tErrno = 0;
bc30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
bc40: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
bc50: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
bc60: 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
bc70: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
bc80: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61  File->h,.      a
bc90: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
bca0: 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
bcb0: 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
bcc0: 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  k),.      azFile
bcd0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  Lock(pFile->pIno
bce0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  de->eFileLock), 
bcf0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
bd00: 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
bd10: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
bd20: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
bd30: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
bd40: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
bd50: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
bd60: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
bd70: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
bd80: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
bd90: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
bda0: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
bdb0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
bdc0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
bdd0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
bde0: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
bdf0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
be10: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
be20: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
be30: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
be40: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
be50: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
be60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be70: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
be80: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
be90: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
bea0: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
beb0: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
bec0: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
bed0: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
bee0: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
bef0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
bf00: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
bf10: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
bf20: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
bf30: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
bf40: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
bf50: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
bf60: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
bf70: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
bf80: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
bf90: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
bfa0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
bfb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
bfc0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
bfd0: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
bfe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
bff0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
c000: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
c010: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c020: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
c030: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
c040: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
c050: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
c060: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
c070: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
c080: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
c090: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
c0a0: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
c0b0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
c0c0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
c0d0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
c0e0: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
c0f0: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
c100: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
c110: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
c120: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
c130: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
c140: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
c150: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
c160: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
c170: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
c180: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
c190: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
c1a0: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
c1b0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
c1c0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
c1d0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
c1e0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
c1f0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
c200: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
c210: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
c220: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
c230: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
c240: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
c250: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
c260: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
c270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c280: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
c290: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c2a0: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
c2b0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c2c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
c2d0: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
c2e0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c2f0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
c300: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
c310: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
c320: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
c330: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c340: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c350: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
c360: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
c370: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
c380: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
c390: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
c3a0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
c3b0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
c3c0: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
c3d0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c3e0: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
c3f0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
c400: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
c410: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
c420: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
c430: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
c440: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
c450: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
c460: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
c470: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
c480: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
c490: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
c4a0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
c4b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
c4c0: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
c4d0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c4e0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
c4f0: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
c500: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
c510: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
c520: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
c530: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
c540: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
c550: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
c560: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
c570: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c580: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
c590: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
c5a0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
c5b0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
c5c0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
c5d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
c5e0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c5f0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
c600: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
c610: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
c620: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
c630: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
c640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
c650: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
c660: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
c670: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
c680: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
c690: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
c6a0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
c6b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
c6c0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
c6d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
c6e0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
c6f0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
c700: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
c710: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c720: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
c730: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
c740: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
c750: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
c760: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
c770: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c780: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c790: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c7a0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c7b0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
c7c0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
c7d0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
c7e0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
c7f0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
c800: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
c810: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
c820: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
c830: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
c840: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
c850: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
c860: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
c870: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
c880: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
c890: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
c8a0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c8b0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
c8c0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
c8d0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c8e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
c8f0: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
c900: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
c910: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
c920: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
c930: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c940: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
c950: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
c960: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
c970: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c980: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c990: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c9b0: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c9c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c9d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c9e0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c9f0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
ca00: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
ca10: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
ca20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
ca30: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
ca40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
ca50: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
ca60: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
ca70: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
ca80: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
ca90: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
caa0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
cab0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
cac0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
cad0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
cae0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
caf0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
cb00: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
cb10: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
cb20: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
cb30: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
cb40: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
cb50: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
cb60: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
cb70: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
cb80: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
cb90: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
cba0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
cbb0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
cbc0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
cbd0: 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
cbe0: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
cbf0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
cc00: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
cc10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
cc20: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
cc30: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
cc40: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
cc50: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
cc60: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
cc70: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
cc80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
cc90: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
cca0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
ccb0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ccc0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
ccd0: 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
cce0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
ccf0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
cd00: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
cd10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cd20: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cd30: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cd40: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
cd50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cd60: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
cd70: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
cd80: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
cd90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cda0: 7d 0a 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44  }.  ..#ifndef ND
cdb0: 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
cdc0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cdd0: 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
cde0: 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
cdf0: 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
ce00: 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
ce10: 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
ce20: 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
ce30: 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
ce40: 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
ce50: 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
ce60: 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
ce70: 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
ce80: 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
ce90: 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
cea0: 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
ceb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
cec0: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
ced0: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
cee0: 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
cef0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
cf00: 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
cf10: 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
cf20: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
cf30: 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
cf40: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
cf50: 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
cf60: 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
cf70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cf80: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
cf90: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
cfa0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
cfb0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
cfc0: 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
cfd0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
cfe0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
cff0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d000: 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
d010: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
d020: 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
d030: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
d040: 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
d050: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
d060: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
d070: 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
d080: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
d090: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
d0a0: 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
d0b0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
d0c0: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
d0d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d0e0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
d0f0: 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
d100: 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
d110: 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
d120: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
d130: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
d140: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
d150: 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
d160: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
d170: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
d180: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
d190: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
d1a0: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
d1b0: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
d1c0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
d1d0: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
d1e0: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
d1f0: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
d200: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
d210: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
d220: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
d230: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
d240: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
d250: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
d260: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
d270: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
d280: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
d290: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
d2a0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
d2b0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
d2c0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
d2d0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
d2e0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
d2f0: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
d300: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d310: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
d320: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
d330: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
d340: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
d350: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
d360: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
d370: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
d380: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
d390: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
d3a0: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
d3b0: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
d3c0: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
d3d0: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
d3e0: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
d3f0: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
d400: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
d410: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
d420: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
d430: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
d440: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
d450: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
d460: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
d470: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
d480: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
d490: 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
d4a0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
d4b0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
d4c0: 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
d4d0: 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
d4e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
d4f0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
d500: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
d510: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
d520: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
d530: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d540: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
d550: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
d560: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
d570: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
d580: 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
d590: 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
d5a0: 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
d5b0: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
d5c0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
d5d0: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
d5e0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
d5f0: 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
d600: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d610: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
d620: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
d630: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
d640: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
d650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d660: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
d670: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
d680: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
d690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
d6a0: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
d6b0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
d6c0: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
d6d0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
d6e0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
d6f0: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
d700: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 6e  ileLock );..#ifn
d710: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
d720: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
d730: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
d740: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
d750: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
d760: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
d770: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
d780: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
d790: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
d7a0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
d7b0: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
d7c0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
d7d0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
d7e0: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
d7f0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
d800: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
d810: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
d820: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
d830: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
d840: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
d850: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
d860: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
d870: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
d880: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
d890: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
d8a0: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
d8b0: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
d8c0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
d8d0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
d8e0: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
d8f0: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
d900: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
d910: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
d920: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
d930: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
d940: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
d950: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
d960: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
d970: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
d980: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
d990: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
d9a0: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
d9b0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
d9c0: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
d9d0: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
d9e0: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
d9f0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
da00: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
da10: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
da20: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
da30: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
da40: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
da50: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
da60: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
da70: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
da80: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
da90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
daa0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
dab0: 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65  LOCK ){..#if !de
dac0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
dad0: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
dae0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
daf0: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
db00: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
db10: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
db20: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
db30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
db40: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
db50: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
db60: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
db70: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
db80: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
db90: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbb0: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
dbc0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
dbd0: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
dbe0: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
dbf0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
dc00: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
dc10: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dc20: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
dc30: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
dc40: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
dc50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
dc60: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
dc70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
dc80: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
dc90: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
dca0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dcb0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
dcc0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
dcd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
dce0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
dcf0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
dd00: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
dd10: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
dd20: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
dd30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
dd40: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
dd50: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
dd60: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
dd70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
dd80: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
dd90: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
dda0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ddb0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
ddc0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
ddd0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
dde0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ddf0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
de00: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
de10: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
de20: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
de30: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
de40: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
de50: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
de60: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
de70: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
de80: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
de90: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
dea0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
deb0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
dec0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ded0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
dee0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
def0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
df10: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
df20: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
df30: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
df40: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
df50: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
df60: 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
df70: 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
df80: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
df90: 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
dfa0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
dfb0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
dfc0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
dfd0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
dfe0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
dff0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e000: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
e010: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
e020: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
e030: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
e040: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
e050: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e060: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
e070: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
e080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e090: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
e0a0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
e0b0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
e0c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
e0d0: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
e0e0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
e0f0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
e100: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e110: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e120: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e130: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e140: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
e150: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e160: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
e170: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
e180: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
e190: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
e1a0: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
e1b0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
e1c0: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
e1d0: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
e1e0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
e1f0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
e200: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
e210: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
e220: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
e230: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
e240: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
e250: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
e260: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
e270: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
e280: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
e290: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
e2a0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
e2b0: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
e2c0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
e2d0: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
e2e0: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
e2f0: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
e300: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
e310: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
e320: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
e330: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
e340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
e350: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  CK;.          pF
e360: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e370: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
e380: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
e390: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e3a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
e3b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e3c0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
e3d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
e3e0: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
e3f0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
e400: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
e410: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
e420: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
e430: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
e440: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
e450: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e460: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
e470: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e480: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
e490: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
e4a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e4b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
e4c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e4d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e4e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
e4f0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
e500: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
e510: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
e520: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
e530: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
e540: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
e550: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
e560: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
e570: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
e580: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
e590: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
e5a0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
e5b0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
e5c0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
e5d0: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
e5e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
e5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
e600: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e610: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
e620: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e630: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
e640: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
e650: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
e660: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
e670: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
e680: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
e690: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
e6a0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
e6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
e6c0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e6d0: 55 4e 4c 4f 43 4b 3b 0a 09 70 46 69 6c 65 2d 3e  UNLOCK;..pFile->
e6e0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
e6f0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  o;.        pInod
e700: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
e710: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
e720: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e730: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
e740: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e750: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
e760: 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61  count of locks a
e770: 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65  gainst this same
e780: 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65   file.  When the
e790: 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65  .    ** count re
e7a0: 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73  aches zero, clos
e7b0: 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65  e any other file
e7c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f   descriptors who
e7d0: 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  se close.    ** 
e7e0: 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63  was deferred bec
e7f0: 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64  ause of outstand
e800: 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a  ing locks..    *
e810: 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  /.    pInode->nL
e820: 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ock--;.    asser
e830: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
e840: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
e850: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
e860: 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  ){.      closePe
e870: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
e880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 09 0a 65 6e 64  .    }.  }...end
e890: 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
e8a0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
e8b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e8c0: 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
e8d0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
e8e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e8f0: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e900: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e910: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e920: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e930: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e940: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e950: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e960: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e970: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e980: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e990: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e9a0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e9b0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e9c0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e9d0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e9e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
e9f0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
ea00: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
ea10: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
ea20: 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
ea30: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
ea40: 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a   eFileLock, 0);.
ea50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
ea60: 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
ea70: 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
ea80: 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
ea90: 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
eaa0: 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
eab0: 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
eac0: 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
ead0: 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
eae0: 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
eaf0: 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
eb00: 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
eb10: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
eb20: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
eb30: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
eb40: 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
eb50: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
eb60: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
eb70: 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
eb80: 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
eb90: 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
eba0: 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
ebb0: 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
ebc0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
ebd0: 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
ebe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
ebf0: 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
ec00: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
ec10: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ec20: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ec30: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  ;.  if( pFile->h
ec40: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73  >=0 ){.    robus
ec50: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
ec60: 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
ec70: 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  _);.    pFile->h
ec80: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f   = -1;.  }.#if O
ec90: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
eca0: 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20  pFile->pId ){.  
ecb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44    if( pFile->isD
ecc0: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 6f  elete ){.      o
ecd0: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
ece0: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
ecf0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
ed00: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
ed10: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
ed20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
ed30: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
ed40: 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
ed50: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  E   %-3d\n", pFi
ed60: 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43  le->h));.  OpenC
ed70: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
ed80: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
ed90: 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65  ->pUnused);.  me
eda0: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
edb0: 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
edc0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
edd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ede0: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
edf0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
ee00: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
ee10: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
ee20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ee30: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ee40: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
ee50: 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
ee60: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
ee70: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
ee80: 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
ee90: 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
eea0: 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
eeb0: 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
eec0: 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
eed0: 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
eee0: 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
eef0: 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
ef00: 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
ef10: 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
ef20: 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
ef30: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
ef40: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
ef50: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
ef60: 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
ef70: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
ef80: 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
ef90: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
efa0: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
efb0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
efc0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
efd0: 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
efe0: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
eff0: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
f000: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
f010: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f020: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
f030: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
f040: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
f050: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
f060: 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
f070: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
f080: 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
f090: 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
f0a0: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
f0b0: 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
f0c0: 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
f0d0: 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
f0e0: 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
f0f0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
f100: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
f120: 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
f130: 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
f140: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
f1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
f200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
f220: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
f230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f250: 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
f260: 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
f270: 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
f280: 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
f290: 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
f2a0: 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
f2b0: 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
f2c0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
f2d0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
f2e0: 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
f2f0: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
f300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
f310: 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
f320: 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
f330: 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
f340: 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
f350: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
f360: 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
f370: 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
f380: 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
f390: 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
f3a0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
f3b0: 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
f3c0: 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
f3d0: 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
f3e0: 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
f3f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
f400: 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
f410: 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
f420: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
f430: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
f440: 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
f450: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
f460: 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
f470: 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
f480: 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
f490: 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
f4a0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
f4b0: 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
f4c0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
f4d0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
f4e0: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
f4f0: 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
f500: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
f510: 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
f520: 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
f530: 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
f540: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
f550: 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
f560: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
f570: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
f580: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
f590: 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
f5a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f5b0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
f5c0: 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
f5d0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
f5e0: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
f5f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f600: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
f610: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
f620: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
f630: 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
f640: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f650: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
f660: 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
f670: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
f680: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
f690: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f6a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f6b0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
f6c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
f6d0: 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
f6e0: 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  _file *id) {.  r
f6f0: 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
f700: 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  ile(id);.}../***
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
f730: 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
f740: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
f7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f810: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74  ****** Begin dot
f820: 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  -file Locking **
f830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
f850: 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c  ** The dotfile l
f860: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
f870: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65  ation uses the e
f880: 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61  xistance of sepa
f890: 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c  rate lock.** fil
f8a0: 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72  es (really a dir
f8b0: 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72  ectory) to contr
f8c0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
f8d0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
f8e0: 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73   works.** on jus
f8f0: 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69  t about every fi
f900: 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61  lesystem imagina
f910: 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20  ble.  But there 
f920: 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e  are serious down
f930: 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  sides:.**.**    
f940: 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65  (1)  There is ze
f950: 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20  ro concurrency. 
f960: 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72   A single reader
f970: 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65   blocks all othe
f980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e  r.**         con
f990: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65  nections from re
f9a0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
f9b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
f9c0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20  *.**    (2)  An 
f9d0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73  application cras
f9e0: 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20  h or power loss 
f9f0: 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20  can leave stale 
fa00: 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20  lock files.**   
fa10: 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72        sitting ar
fa20: 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74  ound that need t
fa30: 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e  o be cleared man
fa40: 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76  ually..**.** Nev
fa50: 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74  ertheless, a dot
fa60: 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f  lock is an appro
fa70: 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d  priate locking m
fa80: 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e  ode for use if n
fa90: 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  o.** other locki
faa0: 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61  ng strategy is a
fab0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
fac0: 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
fad0: 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e  works by creatin
fae0: 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79  g a subdirectory
faf0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
fb00: 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
fb10: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
fb20: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
fb30: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
fb40: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
fb50: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
fb60: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
fb70: 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65  directory implie
fb80: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
fb90: 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a  ock.  All other.
fba0: 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53  ** lock types (S
fbb0: 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
fbc0: 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61   PENDING) are ma
fbd0: 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53  pped into EXCLUS
fbe0: 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IVE..*/../*.** T
fbf0: 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61  he file suffix a
fc00: 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  dded to the data
fc10: 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69   base filename i
fc20: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
fc30: 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69  e the.** lock di
fc40: 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66  rectory..*/.#def
fc50: 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  ine DOTLOCK_SUFF
fc60: 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a  IX ".lock"../*.*
fc70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
fc80: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
fc90: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
fca0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
fcb0: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
fcc0: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
fcd0: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
fce0: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
fcf0: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
fd00: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
fd10: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
fd20: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
fd30: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
fd40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
fd50: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
fd60: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
fd70: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
fd80: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
fd90: 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  cking..**.** In 
fda0: 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
fdb0: 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65   either a lock e
fdc0: 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73  xists or it does
fdd0: 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69   not.  So in thi
fde0: 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f  s.** variation o
fdf0: 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  f CheckReservedL
fe00: 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20  ock(), *pResOut 
fe10: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69  is set to true i
fe20: 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f any lock.** is
fe30: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
fe40: 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74  e and false if t
fe50: 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
fe60: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
fe70: 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  nt dotlockCheckR
fe80: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
fe90: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fea0: 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
feb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fec0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
fed0: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
fee0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fef0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
ff00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
ff10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
ff20: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
ff30: 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
ff40: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
ff50: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
ff60: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
ff70: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
ff80: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
ff90: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
ffa0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
ffb0: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
ffc0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
ffd0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
ffe0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nnection in the 
fff0: 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20  same process.   
10000 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b   ** holds a lock
10010 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e   on the file.  N
10020 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
10030 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
10040 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
10050 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
10060 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69  e lock is held i
10070 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68  f and only if th
10080 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74  e lockfile exist
10090 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  s */.    const c
100a0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
100b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46   (const char*)pF
100c0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
100d0 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65  ext;.    reserve
100e0 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f  d = osAccess(zLo
100f0 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20  ckFile, 0)==0;. 
10100 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
10110 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
10120 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
10130 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
10140 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
10150 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
10160 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
10170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
10180 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
10190 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
101a0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
101b0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
101c0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
101d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
101e0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
101f0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
10200 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
10210 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
10220 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
10230 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
10240 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
10250 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
10260 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
10270 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
10280 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
10290 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
102a0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
102b0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
102c0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
102d0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
102e0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
102f0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
10300 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
10310 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
10320 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
10330 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
10340 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
10350 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
10360 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
10370 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
10380 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
10390 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
103a0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
103b0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
103c0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
103d0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
103e0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
103f0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
10400 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
10410 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
10420 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
10430 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
10440 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
10450 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
10460 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
10470 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
10480 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
10490 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
104a0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
104b0 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
104c0 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
104d0 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
104e0 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
104f0 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
10500 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
10510 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10520 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
10530 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
10540 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
10550 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10560 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
10570 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
10580 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
10590 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
105a0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
105b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
105c0 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
105d0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
105e0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
105f0 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
10600 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
10610 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
10620 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
10630 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
10640 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
10650 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10660 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
10670 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10680 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10690 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
106a0 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
106b0 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
106c0 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
106d0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
106e0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
106f0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
10700 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10710 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10730 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10740 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10750 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20   lock */.  rc = 
10760 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osMkdir(zLockFil
10770 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20  e, 0777);.  if( 
10780 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  rc<0 ){.    /* f
10790 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
107a0 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69  eate the lock di
107b0 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69  rectory */.    i
107c0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
107d0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
107e0 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
107f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10800 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
10810 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
10820 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10830 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10840 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
10850 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
10860 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10870 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10880 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10890 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
108a0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
108b0 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a  rc;.  } .  .  /*
108c0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
108d0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
108e0 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
108f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
10900 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
10910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
10920 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
10930 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
10940 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
10950 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
10960 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
10970 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
10980 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
10990 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
109a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
109b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
109c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
109d0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
109e0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
109f0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
10a00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
10a10 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  p..**.** When th
10a20 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
10a30 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c  reaches NO_LOCK,
10a40 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
10a50 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10a60 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f   int dotlockUnlo
10a70 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10a80 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
10a90 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
10aa0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10ab0 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
10ac0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
10ad0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
10ae0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
10af0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
10b00 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
10b10 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
10b20 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
10b30 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20  d (dotlock)\n", 
10b40 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
10b50 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ock,..   pFile->
10b60 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
10b70 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
10b80 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
10b90 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
10ba0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
10bb0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
10bc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
10bd0 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
10be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10bf0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
10c00 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
10c10 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
10c20 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
10c30 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
10c40 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
10c50 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
10c60 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
10c70 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
10c80 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
10c90 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
10ca0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10cb0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
10cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10cd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10ce0 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
10cf0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
10d00 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
10d10 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
10d20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
10d30 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f  LOCK );.  rc = o
10d40 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sRmdir(zLockFile
10d50 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  );.  if( rc<0 &&
10d60 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20   errno==ENOTDIR 
10d70 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28  ) rc = osUnlink(
10d80 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
10d90 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e  ( rc<0 ){.    in
10da0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
10db0 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  ;.    rc = 0;.  
10dc0 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
10dd0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10df0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
10e00 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
10e10 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
10e20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10e30 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
10e40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
10e50 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
10e60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10e70 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
10e80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10e90 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
10ea0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
10eb0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
10ec0 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
10ed0 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
10ee0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
10ef0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10f00 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  id) {.  int rc;.
10f10 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
10f20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10f30 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10f40 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
10f50 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10f60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10f70 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
10f80 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
10f90 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
10fa0 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  le(id);.  return
10fb0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10fd0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
10fe0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10ff0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
11000 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
110b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110c0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
110d0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
110e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
11100 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
11110 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
11120 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
11130 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
11140 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
11150 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
11160 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
11170 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
11180 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
11190 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
111a0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
111b0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
111c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
111d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
111e0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
111f0 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
11200 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
11210 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
11220 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
11230 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
11240 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
11250 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
11260 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
11270 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
11280 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
11290 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
112a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
112b0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
112c0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
112d0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
112e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
112f0 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
11300 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
11310 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
11320 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
11330 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11340 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
11350 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
11360 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
11370 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
11380 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
11390 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
113a0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
113b0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
113c0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
113d0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
113e0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
113f0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
11400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
11410 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
11420 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
11430 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
11440 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
11450 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
11460 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
11470 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
11480 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
11490 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
114a0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
114b0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
114c0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
114d0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
114e0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
114f0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
11500 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11510 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
11520 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
11530 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
11540 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
11550 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11560 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
11570 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
11580 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
11590 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
115a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
115b0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
115c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
115d0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
115e0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
115f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11600 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
11610 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
11620 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
11630 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
11640 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
11650 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
11660 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
11670 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
11680 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
11690 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
116a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
116b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
116c0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
116d0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
116e0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
116f0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11700 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
11710 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
11720 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
11730 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
11740 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
11750 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
11760 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
11770 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
11780 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
11790 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
117a0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
117b0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
117c0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
117d0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
117e0 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
117f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
11800 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11810 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
11820 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
11830 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
11840 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
11850 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
11860 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
11870 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
11880 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
11890 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
118a0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
118b0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
118c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
118d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
118e0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
118f0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
11900 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
11910 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
11920 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
11930 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
11940 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
11950 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
11960 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
11970 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
11980 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
11990 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
119a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
119b0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
119c0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
119d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
119e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
119f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11a00 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
11a10 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11a20 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
11a30 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11a40 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
11a50 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
11a60 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
11a70 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
11a80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11a90 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
11aa0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
11ab0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
11ac0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
11ad0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
11ae0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
11af0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
11b00 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
11b10 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
11b20 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
11b30 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
11b40 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
11b50 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
11b60 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
11b70 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
11b80 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
11b90 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
11ba0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
11bb0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
11bc0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
11bd0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
11be0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
11bf0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
11c00 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
11c10 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
11c20 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
11c30 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
11c40 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
11c50 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
11c60 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
11c70 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
11c80 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
11c90 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
11ca0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
11cb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
11cc0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
11cd0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
11ce0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
11cf0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
11d00 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
11d10 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
11d20 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
11d30 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
11d40 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
11d50 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
11d60 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
11d70 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
11d80 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
11d90 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
11da0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
11db0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
11dc0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
11dd0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
11de0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
11df0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
11e00 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
11e10 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
11e20 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
11e30 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
11e40 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
11e50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
11e60 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
11e70 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
11e80 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
11e90 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
11ea0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11eb0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
11ec0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
11ed0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
11ee0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
11ef0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
11f00 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
11f10 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
11f20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11f30 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11f40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11f50 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
11f60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11f70 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
11f80 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
11f90 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
11fa0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
11fb0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
11fc0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
11fd0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
11fe0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
11ff0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
12000 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
12010 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12020 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12030 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
12040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12050 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
12060 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
12070 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
12080 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12090 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
120a0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
120b0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
120c0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
120d0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
120e0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
120f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
12100 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
12110 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
12120 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
12130 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
12140 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12150 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12160 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
12170 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
12180 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
12190 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
121a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
121b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
121c0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
121d0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
121e0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
121f0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
12200 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
12210 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
12220 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
12230 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
12240 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
12250 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12260 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
12270 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
12280 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
12290 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
122a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
122b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
122c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
122d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
122e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
122f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
12300 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
12310 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
12320 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
12330 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
12340 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12350 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12360 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12370 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12380 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12390 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
123a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
123b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
123c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
123d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
123e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
123f0 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
12400 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12410 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12420 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
12430 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12440 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
12450 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12460 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
12470 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
12480 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
12490 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
124a0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
124b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
124c0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
124d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
124e0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
124f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
12500 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
12510 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12520 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
12530 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
12540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12550 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
12560 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
12570 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
12580 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12590 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
125a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
125b0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
125c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
125d0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
125e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
125f0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
12600 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
12610 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
12620 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
12630 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
12640 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12650 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
12660 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12670 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
12680 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12690 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
126a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
126b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
126c0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
126d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
126e0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
126f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12700 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
12710 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
12720 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12730 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
12740 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
12750 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b   id ){.    flock
12760 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
12770 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
12780 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
12790 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  id);.}..#endif /
127a0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
127b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
127c0 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
127d0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
127e0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
127f0 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
12800 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12870 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
128d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
128e0 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
128f0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
12920 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
12930 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
12940 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
12950 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
12960 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
12970 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
12980 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
12990 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
129a0 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
129b0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
129c0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
129d0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
129e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
129f0 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
12a00 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
12a10 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
12a20 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
12a30 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
12a40 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
12a50 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
12a60 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
12a70 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12a80 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12a90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12aa0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12ab0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12ac0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12ad0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12ae0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12af0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12b00 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12b10 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12b20 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12b30 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12b40 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12b50 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12b60 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12b70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12b80 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12b90 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12ba0 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76  t semCheckReserv
12bb0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12bc0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12bd0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
12be0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12bf0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12c00 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12c10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12c20 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
12c30 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
12c40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
12c50 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
12c60 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
12c70 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
12c80 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12c90 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12ca0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12cb0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
12cc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
12cd0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12ce0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12cf0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
12d00 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12d10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12d20 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
12d30 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
12d40 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
12d50 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
12d60 70 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74  pSem;.    struct
12d70 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a   stat statBuf;..
12d80 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77      if( sem_tryw
12d90 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
12da0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
12db0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12dc0 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74   if( EAGAIN != t
12dd0 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Errno ){.       
12de0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12df0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12e00 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12e10 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
12e20 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  EDLOCK);.       
12e30 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12e40 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
12e50 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
12e60 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
12e70 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
12e80 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
12e90 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
12ea0 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
12eb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
12ec0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
12ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
12ef0 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
12f00 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
12f10 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
12f20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
12f30 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12f40 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
12f50 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
12f60 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
12f70 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
12f80 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
12f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12fa0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
12fb0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
12fc0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
12fd0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
12fe0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
12ff0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
13000 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
13010 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
13020 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
13030 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
13040 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
13050 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
13060 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
13070 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
13080 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
13090 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
130a0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
130b0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
130c0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
130d0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
130e0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
130f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
13100 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
13110 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
13120 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
13130 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
13140 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
13150 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
13160 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
13170 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
13180 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
13190 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
131a0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
131b0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
131c0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
131d0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
131e0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
131f0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
13200 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
13210 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
13220 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
13230 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
13240 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
13250 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
13260 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
13270 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
13280 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
13290 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
132a0 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
132b0 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
132c0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
132d0 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
132e0 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
132f0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
13300 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
13310 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
13320 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
13330 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
13340 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13350 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
13360 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
13370 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
13380 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
13390 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
133a0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
133b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
133c0 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  emLock(sqlite3_f
133d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
133e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
133f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13400 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
13410 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  nt fd;.  sem_t *
13420 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
13430 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e  node->pSem;.  in
13440 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13450 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
13460 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
13470 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
13480 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
13490 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
134a0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
134b0 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
134c0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
134d0 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
134e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
134f0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
13500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13510 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
13520 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
13530 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68    /* lock semaph
13540 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c  ore now but bail
13550 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64   out when alread
13560 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69  y locked. */.  i
13570 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
13580 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
13590 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
135a0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65  ;.    goto sem_e
135b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
135c0 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
135d0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
135e0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
135f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13600 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65  ileLock;.. sem_e
13610 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72  nd_lock:.  retur
13620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13630 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13640 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13650 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13660 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
13670 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
13680 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13690 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
136a0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
136b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
136c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
136d0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
136e0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
136f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13700 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13710 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13720 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13730 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c  nt semUnlock(sql
13740 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13750 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13760 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13770 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13780 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
13790 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
137a0 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->pSem;..  asser
137b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73  t( pFile );.  as
137c0 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20  sert( pSem );.  
137d0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
137e0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
137f0 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20  id=%d (sem)\n", 
13800 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13810 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ock,..   pFile->
13820 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
13830 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
13840 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
13850 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
13860 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
13870 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
13880 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
13890 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
138a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
138c0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
138d0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
138e0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
138f0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
13900 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
13910 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
13920 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13930 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13960 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
13970 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
13980 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
13990 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
139a0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
139b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
139c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
139d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
139e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
139f0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
13a00 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
13a10 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
13a20 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
13a30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
13a40 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
13a50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13a60 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
13a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13a80 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
13a90 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
13aa0 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69  nt semClose(sqli
13ab0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13ac0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
13ad0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13ae0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
13af0 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69  .    semUnlock(i
13b00 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
13b10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13b20 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
13b30 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
13b40 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
13b50 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
13b60 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
13b70 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13b90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
13ba0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
13bb0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
13bc0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
13bd0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
13be0 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
13bf0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
13c00 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
13c10 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
13c20 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13c30 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13c40 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c90 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ce0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d00 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
13d10 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
13d40 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
13d50 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
13d60 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
13d70 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
13d80 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
13d90 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
13da0 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
13db0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
13dc0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
13dd0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
13de0 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
13df0 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
13e00 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
13e10 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
13e20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
13e30 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
13e40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13e50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
13e60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
13e70 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
13e80 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
13e90 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
13ea0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
13eb0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
13ec0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13ed0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
13ee0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
13ef0 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
13f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
13f10 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
13f20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
13f30 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
13f40 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
13f50 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
13f60 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
13f70 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
13f80 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
13f90 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
13fa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
13fb0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
13fc0 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
13fd0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
13fe0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13ff0 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
14000 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
14010 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
14020 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
14030 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
14040 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
14050 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
14060 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
14070 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
14080 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
14090 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
140a0 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
140b0 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
140c0 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
140f0 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
14100 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
14110 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
14120 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
14130 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
14140 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
14150 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
14160 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
14170 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
14180 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
14190 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
141a0 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
141b0 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
141c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
141d0 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
141e0 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
141f0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
14200 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
14210 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
14220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14230 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
14240 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
14250 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
14260 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14280 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
14290 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
142a0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
142b0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
142c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
142d0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
142e0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
142f0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
14300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14310 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14320 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
14330 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
14340 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
14350 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
14360 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
14370 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
14380 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
14390 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
143a0 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
143b0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
143c0 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
143d0 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
143e0 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
143f0 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
14400 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
14410 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
14420 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
14430 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
14440 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
14450 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
14460 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
14470 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
14480 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
14490 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
144a0 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
144b0 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
144c0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
144d0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
144e0 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
144f0 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
14500 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
14510 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14520 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
14530 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
14540 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
14550 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
14560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
14570 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
14580 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
14590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
145a0 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
145b0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
145c0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
145d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
145e0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
145f0 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
14620 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
14630 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
14640 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
14650 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
14660 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
14670 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
14680 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
14690 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
146a0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
146b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
146c0 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  n rc;.  } else {
146d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
146e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
146f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14700 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14710 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14720 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14730 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14740 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14750 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
14760 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
14770 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14780 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14790 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
147a0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
147b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
147c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
147d0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
147e0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
147f0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14800 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14810 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14820 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52  ic int afpCheckR
14830 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
14840 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14850 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
14860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14870 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
14880 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
14890 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
148a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
148b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
148c0 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d  ontext;.  .  Sim
148d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
148e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
148f0 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14900 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14910 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14920 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
14930 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
14940 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
14950 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
14960 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
14970 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
14980 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
14990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
149a0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
149b0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
149c0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
149d0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
149e0 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
149f0 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
14a00 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
14a10 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
14a20 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
14a30 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
14a40 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
14a50 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
14a60 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14a70 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14a80 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14a90 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
14aa0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
14ab0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
14ac0 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
14ad0 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
14ae0 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
14af0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14b00 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
14b10 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
14b20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
14b30 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
14b40 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
14b50 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
14b60 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
14b70 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
14b80 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
14b90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
14ba0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
14bb0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
14bc0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
14bd0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
14be0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
14bf0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
14c00 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
14c10 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
14c20 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
14c30 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
14c40 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
14c50 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
14c60 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
14c70 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
14c80 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
14c90 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
14ca0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
14cb0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
14cc0 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
14cd0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
14ce0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
14cf0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
14d00 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
14d10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
14d20 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
14d30 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
14d40 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
14d50 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
14d60 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
14d70 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
14d80 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
14d90 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
14da0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14db0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
14dc0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
14dd0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
14de0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
14df0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
14e00 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
14e10 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
14e20 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
14e30 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
14e40 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
14e50 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
14e60 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
14e70 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
14e80 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
14e90 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
14ea0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
14eb0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
14ec0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
14ed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
14ee0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
14ef0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
14f00 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
14f10 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
14f20 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
14f30 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
14f40 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
14f50 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
14f60 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
14f70 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14f80 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
14f90 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
14fa0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14fb0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
14fc0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
14fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
14fe0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
14ff0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
15000 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
15010 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
15020 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
15030 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
15040 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
15050 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15060 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
15070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15080 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
15090 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
150a0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
150b0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
150c0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
150d0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
150e0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
150f0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
15100 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
15110 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
15120 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15130 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
15140 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
15150 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
15160 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
15170 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
15180 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
15190 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
151a0 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
151b0 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
151c0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
151d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
151e0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
151f0 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
15200 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
15210 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
15220 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
15230 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
15240 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
15250 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
15260 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
15270 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
15280 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
15290 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
152a0 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
152b0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
152c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
152d0 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
152e0 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
152f0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
15300 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
15310 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
15320 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
15330 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
15340 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
15350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
15370 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
15380 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
15390 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
153a0 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
153b0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
153c0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
153d0 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
153e0 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
153f0 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
15400 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
15410 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
15420 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
15430 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
15440 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
15450 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
15460 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
15470 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15480 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
15490 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
154a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
154b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
154c0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
154d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
154e0 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
154f0 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
15500 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15510 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
15520 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
15530 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
15540 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
15550 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
15560 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
15570 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
15580 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
15590 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
155a0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
155b0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
155c0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
155d0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
155e0 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
155f0 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
15600 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
15610 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
15620 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
15630 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
15640 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
15650 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
15660 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
15670 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
15680 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
15690 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
156a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
156b0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
156c0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
156d0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
156e0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
156f0 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
15700 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
15710 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
15720 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
15730 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
15740 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
15750 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
15760 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
15770 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
15780 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
15790 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
157a0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
157b0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
157c0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
157d0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
157e0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
157f0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
15800 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15810 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
15820 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
15830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
15840 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
15850 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
15860 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
15870 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
15880 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
15890 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
158a0 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
158b0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
158c0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
158d0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
158e0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
158f0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
15900 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
15910 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
15920 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
15930 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
15940 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
15950 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
15960 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
15970 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
15980 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
15990 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
159a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
159b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
159c0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
159d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
159e0 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
159f0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
15a00 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
15a10 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
15a20 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
15a30 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
15a40 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
15a50 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
15a60 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
15a70 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
15a80 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
15a90 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
15aa0 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
15ab0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
15ac0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
15ad0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
15ae0 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
15af0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15b00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
15b10 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
15b20 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d  rc2, lrc1Errno =
15b30 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c   0;.    long lk,
15b40 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
15b50 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
15b60 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
15b70 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
15b80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
15b90 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
15ba0 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
15bb0 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
15bc0 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
15bd0 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
15be0 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
15bf0 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
15c00 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
15c10 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
15c20 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
15c30 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
15c40 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
15c50 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
15c60 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
15c70 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
15c80 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
15c90 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
15ca0 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
15cb0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15cc0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
15cd0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
15ce0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
15cf0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
15d00 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15d10 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
15d20 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
15d30 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
15d40 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
15d50 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
15d60 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
15d70 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
15d80 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15d90 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
15da0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
15db0 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
15dc0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
15dd0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
15de0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72  ->lastErrno = lr
15df0 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  c1Errno;.      r
15e00 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
15e10 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15e20 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
15e30 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15e40 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
15e50 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
15e60 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15e70 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
15e80 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
15e90 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
15ea0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
15eb0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
15ec0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
15ed0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
15ee0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
15ef0 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
15f00 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
15f10 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15f20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
15f30 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
15f40 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
15f50 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
15f60 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
15f70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
15f80 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
15f90 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
15fa0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
15fb0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
15fc0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
15fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15fe0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
15ff0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
16000 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
16010 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
16020 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
16030 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
16040 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
16050 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
16060 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
16070 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
16080 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
16090 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
160a0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
160b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
160c0 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
160d0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
160e0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
160f0 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
16100 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
16110 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
16120 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
16130 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
16140 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16150 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16160 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16170 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
16180 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
16190 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
161a0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
161b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
161c0 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
161d0 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
161e0 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
161f0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
16200 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
16210 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
16220 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
16230 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
16240 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
16250 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
16260 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
16270 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
16280 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
16290 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
162a0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
162b0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
162c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
162d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
162e0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
162f0 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
16320 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
16330 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
16340 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
16350 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
16360 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
16370 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
16380 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
16390 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
163a0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
163b0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
163c0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
163f0 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
16400 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
16410 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
16420 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16430 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16440 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16450 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16460 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
16470 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
16480 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
16490 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
164a0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
164b0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
164c0 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
164d0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
164e0 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
164f0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
16500 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
16510 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49   ((failed & SQLI
16520 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
16530 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
16540 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
16550 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
16560 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
16570 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
16580 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
16590 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
165a0 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
165b0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
165c0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
165d0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
165e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
165f0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
16600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16610 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16620 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16630 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
16640 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16650 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
16660 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
16670 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
16680 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16690 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
166a0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
166b0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
166c0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
166d0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
166e0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
166f0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16700 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
16710 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
16720 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
16730 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
16740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16750 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16760 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16770 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
16780 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
16790 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
167a0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
167b0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
167c0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
167d0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
167e0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
167f0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
16800 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
16810 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
16820 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
16830 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
16840 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
16850 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
16860 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
16870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
16880 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
16890 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
168a0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
168b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
168c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
168d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
168e0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
168f0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
16900 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16910 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16920 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16930 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16940 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
16950 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
16960 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16970 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
16980 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
16990 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
169a0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
169b0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
169c0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
169d0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
169e0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
169f0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16a00 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
16a10 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
16a20 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
16a30 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
16a40 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29          getpid()
16a50 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
16a60 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
16a70 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
16a80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
16a90 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
16aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ab0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
16ac0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
16ad0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
16ae0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
16af0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
16b00 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
16b10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
16b20 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
16b30 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16b40 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
16b50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
16b60 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16b70 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
16b80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16b90 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
16ba0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
16bb0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
16bc0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
16bd0 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
16be0 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
16bf0 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
16c00 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
16c10 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
16c20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
16c30 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
16c40 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
16c50 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
16c60 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
16c70 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
16c80 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
16c90 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
16ca0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
16cb0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
16cc0 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
16cd0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
16ce0 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
16cf0 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
16d00 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
16d10 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
16d20 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
16d30 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
16d40 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
16d50 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
16d60 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
16d70 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
16d80 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
16d90 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
16da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
16db0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
16dc0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
16dd0 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
16de0 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
16df0 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
16e00 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
16e10 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
16e20 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
16e30 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
16e40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16e50 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16e60 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
16e70 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16e80 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16e90 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
16ea0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
16eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16ec0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
16ed0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16ee0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
16ef0 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
16f00 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
16f10 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
16f20 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
16f30 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
16f40 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
16f50 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
16f60 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
16f70 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
16f80 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16f90 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16fa0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
16fb0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
16fc0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
16fd0 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
16fe0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
16ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
17010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
17020 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
17030 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
17040 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17050 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
17060 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
17070 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
17080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17090 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
170a0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
170b0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
170c0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
170d0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
170e0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
170f0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
17100 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
17110 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
17120 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
17130 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
17140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17160 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
17170 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17180 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
17190 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
171a0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
171b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
171c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
171d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
171e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
171f0 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
17200 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
17210 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
17220 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
17230 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
17240 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
17250 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
17260 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
17270 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
17280 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
17290 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
172a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
172b0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
172c0 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
172d0 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
172e0 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
172f0 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
17300 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
17310 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
17320 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17330 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
17340 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17350 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
17360 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17370 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
17380 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
17390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
173a0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
173b0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
173c0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
173d0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
173e0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
173f0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
17400 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
17410 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
17420 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17430 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
17440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17460 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
17470 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
17480 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17490 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
174a0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
174b0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
174c0 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
174d0 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
174e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
174f0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17500 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17510 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
17520 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
17530 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
17540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
17550 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
17560 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
17570 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
17580 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
17590 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
175a0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
175b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
175c0 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
175d0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
175e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
175f0 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
17600 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
17610 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
17620 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
17630 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
17640 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
17650 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
17660 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
17670 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
17680 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
17690 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
176a0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
176b0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
176c0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
176d0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
176e0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
176f0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
17700 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
17710 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
17720 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
17730 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
17740 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
17750 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
17760 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
17770 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
17780 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
17790 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
177a0 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
177b0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
177c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
177d0 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
177e0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
177f0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
17800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17810 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
17820 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
17830 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
17840 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
17850 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
17860 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
17870 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
17880 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
17890 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
178a0 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
178b0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
178c0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
178d0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
178e0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
178f0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
17900 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
17910 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
17920 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
17930 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
17940 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
17960 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
17970 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17980 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179e0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a50 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
17a60 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
17a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
17a90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
17aa0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
17ab0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
17ac0 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
17ad0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17ae0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17af0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
17b00 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
17b10 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
17b20 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17b30 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
17b40 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
17b50 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
17b60 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17b70 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
17b80 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
17b90 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
17ba0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
17bb0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17bc0 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
17bd0 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
17be0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17bf0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
17c00 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
17c10 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
17c20 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
17c30 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
17c40 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
17c50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
17c60 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
17c70 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
17c80 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
17c90 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
17ca0 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
17cb0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
17cc0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
17cd0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
17ce0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
17cf0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
17d00 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
17d10 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17d20 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
17d30 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
17d40 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17db0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
17dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
17e10 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
17e20 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
17e30 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
17e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17e50 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
17e60 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
17e70 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
17e80 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
17e90 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
17ea0 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
17eb0 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
17ec0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
17ed0 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
17ee0 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
17ef0 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
17f00 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
17f10 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
17f20 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
17f30 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
17f40 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
17f50 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
17f60 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
17f70 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
17f80 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
17f90 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
17fa0 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
17fb0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
17fc0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
17fd0 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
17fe0 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
17ff0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18000 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
18010 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
18020 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
18030 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
18040 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
18050 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
18060 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
18070 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
18080 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
18090 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
180a0 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
180b0 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
180c0 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
180d0 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
180e0 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20  READ.** any any 
180f0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
18100 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
18110 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
18120 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
18130 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
18140 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
18150 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
18160 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
18170 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
18180 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
18190 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
181a0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
181b0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
181c0 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
181d0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
181e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
181f0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
18200 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
18210 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f   got;.  int prio
18220 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66  r = 0;.#if (!def
18230 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
18240 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
18250 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
18260 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
18270 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
18280 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
18290 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
182a0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28    got = osPread(
182b0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
182c0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
182d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
182e0 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
182f0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18300 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d  EAD64).    got =
18310 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
18320 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
18330 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
18340 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18350 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20   -1 );.#else.   
18360 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
18370 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
18380 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
18390 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
183a0 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b  ( newOffset-- );
183b0 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
183c0 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
183d0 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
183e0 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
183f0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18400 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18410 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c  errno;.      }el
18420 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e  se{.        ((un
18430 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
18440 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20  tErrno = 0;.... 
18450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
18460 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
18470 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
18480 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
18490 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
184a0 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
184b0 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
184c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
184d0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
184e0 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
184f0 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
18500 20 30 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78   0;.      ((unix
18510 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18520 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18540 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
18550 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
18560 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
18570 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
18580 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
18590 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
185a0 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
185b0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
185c0 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
185d0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
185e0 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
185f0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
18600 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
18610 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
18620 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
18630 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
18640 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
18650 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
18660 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
18670 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
18680 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
18690 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
186a0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
186b0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
186c0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
186d0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
186e0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
186f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
18700 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
18710 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
18720 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
18730 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
18740 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
18750 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
18760 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
18770 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
18780 73 65 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f  sert( id );..  /
18790 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
187a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
187b0 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
187c0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
187d0 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
187e0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
187f0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
18800 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
18810 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
18820 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
18830 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
18840 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
18850 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
18860 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
18870 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
18880 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
18890 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
188a0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
188b0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
188c0 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
188d0 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
188e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
188f0 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
18900 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
18910 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
18920 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
18930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18940 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
18950 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
18960 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
18970 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
18980 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
18990 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
189a0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
189b0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
189c0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
189d0 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
189e0 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
189f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18a00 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
18a10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65    }.}../*.** See
18a20 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
18a30 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
18a40 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
18a50 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
18a60 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18a70 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
18a80 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
18a90 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
18aa0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
18ab0 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
18ac0 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
18ad0 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
18ae0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
18af0 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
18b00 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
18b10 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
18b20 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
18b30 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
18b40 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
18b50 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
18b60 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
18b70 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
18b80 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
18b90 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
18ba0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
18bb0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
18bc0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18bd0 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
18be0 20 6f 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c   osPwrite(id->h,
18bf0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
18c00 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  et); }while( got
18c10 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
18c20 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
18c30 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
18c40 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
18c50 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70  write64(id->h, p
18c60 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18c70 29 3b 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  );}while( got<0 
18c80 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
18c90 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
18ca0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
18cb0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
18cc0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
18cd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18ce0 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
18cf0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
18d00 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
18d10 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
18d20 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
18d30 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18d40 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18d50 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
18d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
18d70 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18d80 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09 0a  stErrno = 0;....
18d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18da0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
18db0 20 20 20 67 6f 74 20 3d 20 6f 73 57 72 69 74 65     got = osWrite
18dc0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18dd0 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f  t);.  }while( go
18de0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
18df0 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NTR );.#endif.  
18e00 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28  TIMER_END;.  if(
18e10 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28   got<0 ){.    ((
18e20 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
18e30 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
18e40 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
18e50 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
18e60 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
18e70 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
18e80 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
18e90 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
18ea0 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   got;.}.../*.** 
18eb0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
18ec0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
18ed0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
18ee0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18ef0 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
18f00 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
18f10 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
18f20 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
18f30 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
18f40 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
18f50 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
18f60 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
18f70 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
18f80 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
18f90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18fa0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
18fb0 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
18fc0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
18fd0 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
18fe0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
18ff0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
19000 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
19010 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
19020 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
19030 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
19040 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
19050 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
19060 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
19070 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
19080 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
19090 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
190a0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
190b0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
190c0 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
190d0 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
190e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
190f0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  NDEBUG.  /* If w
19100 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
19110 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
19120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
19130 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
19140 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
19150 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
19160 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
19170 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
19180 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
19190 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
191a0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
191b0 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
191c0 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
191d0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
191e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
191f0 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
19200 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
19210 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
19220 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
19230 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
19240 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
19250 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
19260 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
19270 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
19280 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
19290 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
192a0 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
192b0 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
192c0 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
192d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
192e0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
192f0 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
19300 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
19310 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
19320 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
19330 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
19340 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
19350 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
19360 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
19370 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
19380 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
19390 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
193a0 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
193b0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
193c0 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
193d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
193e0 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28  #endif..  while(
193f0 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
19400 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
19410 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19420 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
19430 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
19440 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  ;.    offset += 
19450 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
19460 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
19470 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53  [wrote];.  }.  S
19480 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28  imulateIOError((
19490 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74   wrote=(-1), amt
194a0 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  =1 ));.  Simulat
194b0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28  eDiskfullError((
194c0 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20   wrote=0, amt=1 
194d0 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30  ));..  if( amt>0
194e0 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74   ){.    if( wrot
194f0 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61  e<0 && pFile->la
19500 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20  stErrno!=ENOSPC 
19510 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74  ){.      /* last
19520 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
19530 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20  kAndWrite */.   
19540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19550 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
19560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19570 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
19580 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
19590 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
195a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
195b0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
195c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
195d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
195e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
195f0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
19600 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
19610 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
19620 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
19630 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
19640 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
19650 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
19660 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
19670 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
19680 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
19690 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
196a0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
196b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
196c0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
196d0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
196e0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
196f0 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
19700 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
19710 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
19720 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
19730 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
19740 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
19750 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
19760 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
19770 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
19780 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
19790 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
197a0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
197b0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
197c0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f  ync=fdatasync.*/
197d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
197e0 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e  atasync).# defin
197f0 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
19800 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
19810 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
19820 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
19830 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
19840 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
19850 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
19860 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
19870 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
19880 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
19890 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
198a0 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
198b0 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
198c0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
198d0 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
198e0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
198f0 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
19900 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
19910 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
19920 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
19930 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
19940 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
19950 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
19960 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
19970 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
19980 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
19990 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
199a0 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
199b0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
199c0 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
199d0 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
199e0 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
199f0 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
19a00 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
19a10 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
19a20 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
19a30 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
19a40 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
19a50 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
19a60 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
19a70 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
19a80 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
19a90 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
19aa0 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
19ab0 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
19ac0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
19ad0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
19ae0 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
19af0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
19b00 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
19b10 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
19b20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
19b30 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
19b40 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
19b50 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
19b60 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
19b70 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
19b80 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
19b90 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
19ba0 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
19bb0 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
19bc0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
19bd0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
19be0 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
19bf0 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
19c00 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
19c10 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
19c20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
19c30 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
19c40 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
19c50 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
19c60 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
19c70 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
19c80 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
19c90 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
19ca0 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
19cb0 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
19cc0 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
19cd0 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
19ce0 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
19cf0 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
19d00 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
19d10 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
19d20 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
19d30 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
19d40 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
19d50 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
19d60 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
19d70 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
19d80 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
19d90 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
19da0 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
19db0 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
19dc0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
19dd0 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
19de0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
19df0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
19e00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
19e10 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
19e20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
19e30 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
19e40 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
19e50 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
19e60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
19e70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
19e80 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
19e90 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
19ea0 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
19eb0 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
19ec0 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
19ed0 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
19ee0 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
19ef0 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
19f00 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
19f10 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
19f20 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
19f30 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
19f40 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
19f50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
19f60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
19f70 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
19f80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19f90 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
19fa0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
19fb0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
19fc0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
19fd0 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
19fe0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
19ff0 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1a000 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1a010 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1a020 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1a030 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1a040 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1a050 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1a060 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1a070 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1a080 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1a090 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1a0a0 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1a0b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1a0c0 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1a0d0 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1a0e0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1a0f0 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1a100 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1a110 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1a120 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1a130 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1a140 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1a150 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1a160 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1a170 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1a180 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
1a190 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1a1a0 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
1a1b0 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  K;.#elif HAVE_FU
1a1c0 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1a1d0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1a1e0 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1a1f0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1a200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1a210 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1a220 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1a230 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1a240 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1a250 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1a260 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1a270 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1a280 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1a290 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1a2a0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1a2b0 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1a2c0 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1a2d0 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1a2e0 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1a2f0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1a300 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1a310 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1a320 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1a330 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1a340 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1a350 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1a360 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1a370 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1a380 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1a390 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1a3a0 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1a3b0 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1a3c0 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1a3d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1a3e0 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1a3f0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1a400 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1a410 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1a420 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1a430 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1a440 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1a450 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1a460 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1a470 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1a480 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1a490 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1a4a0 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1a4b0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1a4c0 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1a4d0 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1a4e0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1a4f0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1a500 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1a510 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1a520 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1a530 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1a540 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1a550 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1a560 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1a570 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1a580 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1a590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1a5a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1a5c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a5d0 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1a5e0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1a5f0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1a600 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1a610 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1a620 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1a630 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1a640 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a650 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1a660 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1a670 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1a680 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1a690 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1a6a0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1a6b0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1a6c0 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1a6d0 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1a6e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1a6f0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1a700 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1a710 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1a720 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1a730 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1a740 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1a750 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1a760 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1a770 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1a780 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1a790 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1a7a0 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1a7b0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1a7c0 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1a7d0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1a7e0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1a7f0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1a800 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1a810 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1a820 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1a830 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1a840 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1a850 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1a860 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1a870 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1a880 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1a890 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1a8a0 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1a8b0 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1a8c0 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1a8d0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1a8e0 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1a8f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1a900 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1a910 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1a920 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1a930 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1a940 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1a950 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1a960 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1a970 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1a980 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1a990 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1a9a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1a9b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1a9c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1a9d0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1a9e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1a9f0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1aa00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aa10 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1aa20 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1aa30 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1aa40 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1aa50 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1aa60 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1aa70 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1aa80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1aa90 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1aaa0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1aab0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1aac0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1aad0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1aae0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1aaf0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1ab00 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1ab10 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1ab20 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
1ab30 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1ab40 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1ab50 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
1ab60 64 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46  d>=0 ){.#ifdef F
1ab70 44 5f 43 4c 4f 45 58 45 43 0a 20 20 20 20 20 20  D_CLOEXEC.      
1ab80 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  osFcntl(fd, F_SE
1ab90 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c  TFD, osFcntl(fd,
1aba0 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
1abb0 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
1abc0 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1abd0 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
1abe0 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
1abf0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1ac00 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1ac10 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51  return (fd>=0?SQ
1ac20 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45  LITE_OK:unixLogE
1ac30 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ac40 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1ac50 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d  ", zDirname));.}
1ac60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1ac70 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1ac80 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1ac90 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1aca0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1acb0 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1acc0 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1acd0 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1ace0 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1acf0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1ad00 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1ad10 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1ad20 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1ad30 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1ad40 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1ad50 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1ad60 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1ad70 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1ad80 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1ad90 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1ada0 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1adb0 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1adc0 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1add0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1ade0 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1adf0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1ae00 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1ae10 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1ae20 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1ae30 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1ae40 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1ae50 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1ae60 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1ae70 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1ae80 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1ae90 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1aea0 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1aeb0 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1aec0 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1aed0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1aee0 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1aef0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1af00 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1af10 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1af20 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1af30 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1af40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1af50 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1af60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1af70 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1af80 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1af90 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1afa0 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1afb0 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1afc0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1afd0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1afe0 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1aff0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1b000 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1b010 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1b020 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1b030 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1b040 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1b050 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1b060 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1b070 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1b080 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1b090 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1b0a0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1b0b0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1b0c0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1b0d0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1b0e0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1b0f0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1b100 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1b110 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1b120 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1b130 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1b140 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1b150 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1b160 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1b170 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1b180 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1b190 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1b1a0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1b1b0 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1b1c0 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1b1d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1b1e0 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1b1f0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
1b200 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1b210 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1b220 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1b230 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1b240 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1b250 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1b260 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1b270 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1b280 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1b290 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1b2a0 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1b2b0 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1b2c0 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1b2d0 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rance.  Many sys
1b2e0 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1b2f0 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1b300 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1b310 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1b320 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1b330 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1b340 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1b350 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1b360 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1b370 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1b380 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1b390 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1b3a0 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1b3b0 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1b3c0 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1b3d0 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1b3e0 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1b3f0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1b400 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1b410 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1b420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b430 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d  TE_OK && dirfd>=
1b440 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  0 ){.      full_
1b450 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1b460 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  0);.      robust
1b470 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69  _close(pFile, di
1b480 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1b490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1b4a0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
1b4b0 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  N ){.      rc = 
1b4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b4d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1b4e0 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49  Flags &= ~UNIXFI
1b4f0 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a  LE_DIRSYNC;.  }.
1b500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b510 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1b520 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1b530 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1b540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1b550 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1b560 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1b570 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46   nByte){.  unixF
1b580 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1b590 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1b5a0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1b5b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
1b5c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1b5d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1b5e0 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20  _TRUNCATE );..  
1b5f0 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
1b600 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
1b610 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
1b620 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
1b630 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
1b640 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
1b650 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
1b660 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
1b670 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
1b680 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
1b690 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
1b6a0 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
1b6b0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
1b6c0 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
1b6d0 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
1b6e0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29  pFile->szChunk )
1b6f0 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1b700 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1b710 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1b720 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1b730 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1b740 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1b750 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1b760 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74  ->h, (off_t)nByt
1b770 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1b780 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1b790 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1b7a0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1b7b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1b7c0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1b7d0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1b7e0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
1b7f0 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
1b800 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1b810 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1b820 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1b830 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1b840 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1b850 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1b860 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1b870 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1b880 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1b890 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1b8a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1b8b0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1b8c0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1b8d0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1b8e0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1b8f0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1b900 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1b910 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1b920 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1b930 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1b940 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1b950 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1b960 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1b970 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1b980 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1b990 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1b9a0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1b9b0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1b9c0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1b9d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1b9e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b9f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1ba00 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1ba10 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1ba20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1ba30 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1ba40 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1ba50 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1ba60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1ba70 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1ba80 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1ba90 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1baa0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1bab0 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1bac0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1bad0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1bae0 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
1baf0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
1bb00 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1bb10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1bb20 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
1bb30 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
1bb40 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
1bb50 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
1bb60 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
1bb70 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
1bb80 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
1bb90 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
1bba0 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
1bbb0 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
1bbc0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
1bbd0 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
1bbe0 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
1bbf0 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
1bc00 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
1bc10 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
1bc20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
1bc30 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
1bc40 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
1bc50 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
1bc60 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
1bc70 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
1bc80 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
1bc90 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
1bca0 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
1bcb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1bcc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
1bcd0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1bce0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1bcf0 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
1bd00 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
1bd10 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
1bd20 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
1bd30 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
1bd40 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
1bd50 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
1bd60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
1bd70 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
1bd80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1bd90 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1bda0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1bdb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1bdc0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
1bdd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1bde0 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
1bdf0 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
1be00 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
1be10 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
1be20 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
1be30 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
1be40 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
1be50 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1be60 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
1be70 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
1be80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1be90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1bea0 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
1beb0 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
1bec0 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
1bed0 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
1bee0 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1bef0 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf10 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
1bf20 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
1bf30 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
1bf40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1bf50 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
1bf60 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
1bf70 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
1bf80 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
1bf90 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72 65 74  ->h, &buf) ) ret
1bfa0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1bfb0 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69  _FSTAT;..    nSi
1bfc0 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
1bfd0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
1bfe0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
1bff0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1c000 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
1c010 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
1c020 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
1c030 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
1c040 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
1c050 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
1c060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1c070 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
1c080 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
1c090 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
1c0a0 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
1c0b0 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
1c0c0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
1c0d0 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
1c0e0 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
1c0f0 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
1c100 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
1c110 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
1c120 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
1c130 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1c140 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
1c150 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1c160 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
1c170 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
1c180 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1c190 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
1c1a0 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
1c1b0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
1c1c0 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
1c1d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1c1e0 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
1c1f0 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
1c200 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
1c210 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
1c220 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20 75 73  ake it. First us
1c230 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72 75 6e  e.      ** ftrun
1c240 63 61 74 65 28 29 20 74 6f 20 73 65 74 20 74 68  cate() to set th
1c250 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74 68 65  e file size, the
1c260 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  n write a single
1c270 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20 20 2a   byte to.      *
1c280 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  * the last byte 
1c290 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 77 69  in each block wi
1c2a0 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1c2b0 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73 0a 20  d region. This. 
1c2c0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73       ** is the s
1c2d0 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20 75 73  ame technique us
1c2e0 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f 20 69  ed by glibc to i
1c2f0 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78 5f 66  mplement posix_f
1c300 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20 20 20  allocate().     
1c310 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73 20 74   ** on systems t
1c320 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1c330 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1c340 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  () system call..
1c350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c360 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
1c370 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
1c380 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
1c390 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  size */.      i6
1c3a0 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
1c3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1c3c0 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
1c3d0 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
1c3e0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
1c3f0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
1c400 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
1c410 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1c420 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1c430 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1c440 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c450 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1c460 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1c470 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1c480 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1c490 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
1c4a0 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
1c4b0 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
1c4c0 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e 53  while( iWrite<nS
1c4d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1c4e0 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b  nt nWrite = seek
1c4f0 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1c500 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a  iWrite, "", 1);.
1c510 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
1c520 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  te!=1 ) return S
1c530 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1c540 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69 74  E;.        iWrit
1c550 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20  e += nBlk;.     
1c560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1c570 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1c580 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c590 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1c5a0 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  ititially negati
1c5b0 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
1c5c0 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
1c5d0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
1c5e0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1c5f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
1c600 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
1c610 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
1c620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
1c630 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
1c640 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
1c650 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
1c660 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
1c670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1c680 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46  nixModeBit(unixF
1c690 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69  ile *pFile, unsi
1c6a0 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20  gned char mask, 
1c6b0 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66  int *pArg){.  if
1c6c0 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20  ( *pArg<0 ){.   
1c6d0 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d   *pArg = (pFile-
1c6e0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73  >ctrlFlags & mas
1c6f0 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  k)!=0;.  }else i
1c700 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b  f( (*pArg)==0 ){
1c710 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1c720 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a  Flags &= ~mask;.
1c730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
1c740 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1c750 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   mask;.  }.}../*
1c760 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
1c770 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
1c780 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
1c790 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c7a0 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
1c7b0 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
1c7c0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
1c7d0 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46   *pArg){.  unixF
1c7e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c7f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  ixFile*)id;.  sw
1c800 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1c810 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c820 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1c830 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1c840 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1c850 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1c860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c870 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1c880 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
1c890 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1c8a0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1c8b0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1c8c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c8d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1c8e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1c8f0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1c900 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1c910 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1c920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c930 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1c940 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c950 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1c960 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1c970 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c980 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1c990 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1c9a0 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1c9b0 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1c9c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c9d0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1c9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c9f0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1ca00 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1ca10 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e  _WAL: {.      un
1ca20 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1ca30 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1ca40 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1ca50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1ca60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ca70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1ca80 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1ca90 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1caa0 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1cab0 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1cac0 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
1cad0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1cae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1caf0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1cb00 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1cb10 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1cb20 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1cb30 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1cb40 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1cb50 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1cb60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cb70 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1cb80 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
1cb90 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
1cba0 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
1cbb0 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
1cbc0 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
1cbd0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
1cbe0 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
1cbf0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
1cc00 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
1cc10 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
1cc20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1cc30 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
1cc40 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
1cc50 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
1cc60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1cc70 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
1cc80 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
1cc90 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
1cca0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
1ccb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ccc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1ccd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cce0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
1ccf0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1cd00 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
1cd10 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
1cd20 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1cd30 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
1cd40 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
1cd50 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
1cd60 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
1cd70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
1cd80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1cd90 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1cda0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
1cdb0 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
1cdc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1cdd0 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  OTFOUND;.}../*.*
1cde0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
1cdf0 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
1ce00 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  s of the underly
1ce10 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65  ing block device
1ce20 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63   for.** the spec
1ce30 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73  ified file. This
1ce40 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
1ce50 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74  s 512 bytes, but
1ce60 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65   may be.** large
1ce70 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63  r for some devic
1ce80 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  es..**.** SQLite
1ce90 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
1cea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e  is function cann
1ceb0 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f  ot fail. It also
1cec0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   assumes that.**
1ced0 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72   if two files ar
1cee0 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  e created in the
1cef0 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65   same file-syste
1cf00 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  m directory (i.e
1cf10 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  ..** a database 
1cf20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  and its journal 
1cf30 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73  file) that the s
1cf40 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1cf50 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66  be the.** same f
1cf60 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74  or both..*/.stat
1cf70 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f  ic int unixSecto
1cf80 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1cf90 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 28 76  le *pFile){.  (v
1cfa0 6f 69 64 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  oid)pFile;.  ret
1cfb0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
1cfc0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1cfd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cfe0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1cff0 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74  cteristics for t
1d000 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
1d010 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75  his VFS is set u
1d020 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  p to return SQLI
1d030 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1d040 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20  FE_OVERWRITE by 
1d050 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65  default..** Howe
1d060 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65  ver, that choice
1d070 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69 61   is contraversia
1d080 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61  l since technica
1d090 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69  lly the underlyi
1d0a0 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  ng.** file syste
1d0b0 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79  m does not alway
1d0c0 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73  s provide powers
1d0d0 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20  afe overwrites. 
1d0e0 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f   (In other.** wo
1d0f0 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77  rds, after a pow
1d100 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70  er-loss event, p
1d110 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65  arts of the file
1d120 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72   that were never
1d130 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68  .** written migh
1d140 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61  t end up being a
1d150 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65  ltered.)  Howeve
1d160 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61  r, non-PSOW beha
1d170 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a  vior is very,.**
1d180 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64   very rare.  And
1d190 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20   asserting PSOW 
1d1a0 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65  makes a large re
1d1b0 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61  duction in the a
1d1c0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75  mount.** of requ
1d1d0 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75  ired I/O for jou
1d1e0 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61  rnaling, since a
1d1f0 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20   lot of padding 
1d200 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a  is eliminated..*
1d210 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20  *  Hence, while 
1d220 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1d230 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ITE is on by def
1d240 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61  ault, there is a
1d250 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a   file-control.**
1d260 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
1d270 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52  rn it off and UR
1d280 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  I query paramete
1d290 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  r available to t
1d2a0 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73  urn it off..*/.s
1d2b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65  tatic int unixDe
1d2c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1d2d0 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
1d2e0 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
1d2f0 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
1d300 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 2d 3e 63  *)id;.  if( p->c
1d310 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1d320 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20  ILE_PSOW ){.    
1d330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d340 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1d350 45 52 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  ERWRITE;.  }else
1d360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1d370 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
1d380 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
1d390 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
1d3a0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1d3b0 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  an shared memory
1d3c0 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a   buffer.  .**.**
1d3d0 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
1d3e0 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
1d3f0 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61  ence the same wa
1d400 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68  l-index, each th
1d410 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20  read.** has its 
1d420 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  own unixShm obje
1d430 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
1d440 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
1d450 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  le instance.** o
1d460 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f  f this unixShmNo
1d470 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  de object.  In o
1d480 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
1d490 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70   wal-index is op
1d4a0 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63  ened.** only onc
1d4b0 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
1d4c0 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68  *.** Each unixSh
1d4d0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1d4e0 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73  connected to a s
1d4f0 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49  ingle unixInodeI
1d500 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57  nfo object..** W
1d510 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65  e could coalesce
1d520 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74   this object int
1d530 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c  o unixInodeInfo,
1d540 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20   but that would 
1d550 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70  mean.** every op
1d560 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65  en file that doe
1d570 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64  s not use shared
1d580 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65   memory (in othe
1d590 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a  r words, most.**
1d5a0 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75   open files) wou
1d5b0 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79  ld have to carry
1d5c0 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74   around this ext
1d5d0 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ra information. 
1d5e0 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49   So.** the unixI
1d5f0 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
1d600 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1d610 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53  er to this unixS
1d620 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a  hmNode object.**
1d630 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d   and the unixShm
1d640 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1d650 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  reated only when
1d660 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75   needed..**.** u
1d670 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
1d680 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
1d690 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
1d6a0 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
1d6b0 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
1d6c0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1d6d0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1d6e0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
1d6f0 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54      nRef.**.** T
1d700 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1d710 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1d720 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1d730 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1d740 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
1d750 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
1d760 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e  .**.** Either un
1d770 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  ixShmNode.mutex 
1d780 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
1d790 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
1d7a0 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d  ==0 and.** unixM
1d7b0 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
1d7c0 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
1d7d0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
1d7e0 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
1d7f0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
1d800 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53  .*/.struct unixS
1d810 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49  hmNode {.  unixI
1d820 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1d830 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f  ;     /* unixIno
1d840 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73  deInfo that owns
1d850 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a   this SHM node *
1d860 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1d870 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
1d880 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
1d890 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
1d8a0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
1d8b0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
1d8c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61   Name of the mma
1d8d0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
1d8e0 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1d8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
1d900 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1d910 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  r */.  int szReg
1d920 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1d930 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
1d940 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d950 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67  ns */.  u16 nReg
1d960 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1d970 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
1d980 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
1d990 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b    u8 isReadonly;
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9b0 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c  True if read-onl
1d9c0 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  y */.  char **ap
1d9d0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1d9e0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61    /* Array of ma
1d9f0 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  pped shared-memo
1da00 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
1da10 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
1da20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1da30 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
1da40 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1da50 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
1da60 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
1da70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
1da80 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
1da90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1daa0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1dab0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63  E_DEBUG.  u8 exc
1dac0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1dad0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1dae0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1daf0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61  held */.  u8 sha
1db00 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
1db10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1db20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1db30 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68  d */.  u8 nextSh
1db40 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1db50 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
1db60 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76  ble unixShm.id v
1db70 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
1db80 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
1db90 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
1dba0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
1dbb0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
1dbc0 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
1dbd0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
1dbe0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
1dbf0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1dc00 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
1dc10 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
1dc20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1dc30 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
1dc40 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
1dc50 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78  r:.**.**    unix
1dc60 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20  Shm.pFile.**    
1dc70 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a  unixShm.id.**.**
1dc80 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
1dc90 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
1dca0 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70  .  The unixShm.p
1dcb0 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  File->mutex must
1dcc0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
1dcd0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
1dce0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
1dcf0 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  s..*/.struct uni
1dd00 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
1dd10 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
1dd20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
1dd30 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64  lying unixShmNod
1dd40 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
1dd50 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
1dd60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1dd70 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
1dd80 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f  e same unixShmNo
1dd90 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
1dda0 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
1ddb0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
1ddc0 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68  lding the unixSh
1ddd0 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
1dde0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1de00 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1de10 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20  tion within its 
1de20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1de30 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
1de40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1de50 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1de60 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
1de70 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
1de80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1de90 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
1dea0 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a  cks held */.};..
1deb0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
1dec0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1ded0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  .*/.#define UNIX
1dee0 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
1def0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
1df00 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a  K)*4)         /*
1df10 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
1df20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
1df30 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49  _SHM_DMS    (UNI
1df40 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  X_SHM_BASE+SQLIT
1df50 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
1df60 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
1df70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
1df80 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
1df90 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74  ocks for all byt
1dfa0 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72  es from ofst thr
1dfb0 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a  ough ofst+n-1..*
1dfc0 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b  *.** Locks block
1dfd0 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20   if the mask is 
1dfe0 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d  exactly UNIX_SHM
1dff0 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62  _C and are non-b
1e000 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72  locking.** other
1e010 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1e020 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65  int unixShmSyste
1e030 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d  mLock(.  unixShm
1e040 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20  Node *pShmNode, 
1e050 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
1e060 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
1e070 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1e080 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
1e090 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ype,          /*
1e0a0 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
1e0b0 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
1e0c0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1e0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1e0e0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c  st byte of the l
1e0f0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a  ocking range */.
1e100 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20    int n         
1e110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e120 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1e130 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
1e140 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
1e150 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61    /* The posix a
1e160 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
1e170 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
1e180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e190 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63  K;   /* Result c
1e1a0 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29  ode form fcntl()
1e1b0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
1e1c0 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   to the unixShmN
1e1d0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
1e1e0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
1e1f0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
1e200 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e210 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
1e220 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
1e230 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
1e240 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
1e250 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
1e260 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
1e270 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
1e280 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
1e290 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
1e2a0 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
1e2b0 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
1e2c0 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53  ert( n>=1 && n<S
1e2d0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1e2e0 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
1e2f0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
1e300 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1e310 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1e320 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ters */.    mems
1e330 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
1e340 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79  (f));.    f.l_ty
1e350 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20  pe = lockType;. 
1e360 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20     f.l_whence = 
1e370 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e  SEEK_SET;.    f.
1e380 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a  l_start = ofst;.
1e390 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b      f.l_len = n;
1e3a0 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ..    rc = osFcn
1e3b0 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  tl(pShmNode->h, 
1e3c0 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20  F_SETLK, &f);.  
1e3d0 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29    rc = (rc!=(-1)
1e3e0 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
1e3f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1e400 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1e410 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74  e global lock st
1e420 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67  ate and do debug
1e430 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64   tracing */.#ifd
1e440 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1e450 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20    { u16 mask;.  
1e460 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1e470 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d  CK "));.  mask =
1e480 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
1e490 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
1e4a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e4b0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
1e4c0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1e4d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e4e0 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
1e4f0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1e500 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1e510 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1e520 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1e530 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1e540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
1e550 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
1e560 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1e570 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
1e580 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
1e590 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
1e5a0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1e5b0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1e5c0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
1e5d0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
1e5e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1e5f0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1e600 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e610 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
1e620 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
1e630 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
1e640 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e650 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1e660 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1e670 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1e680 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
1e690 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
1e6a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
1e6b0 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
1e6c0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
1e6d0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1e6e0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1e6f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1e700 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
1e710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e720 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
1e730 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
1e740 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e750 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
1e760 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
1e770 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
1e780 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
1e790 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
1e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
1e7b0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
1e7c0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
1e7d0 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
1e7e0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1e7f0 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a          .}.../*.
1e800 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
1e810 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
1e820 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
1e830 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
1e840 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
1e850 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
1e860 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1e870 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
1e880 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
1e890 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
1e8a0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
1e8b0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
1e8c0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
1e8d0 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
1e8e0 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
1e8f0 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
1e900 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1e910 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
1e920 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
1e930 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d  f( p && p->nRef=
1e940 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
1e950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e960 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e  pInode==pFd->pIn
1e970 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ode );.    sqlit
1e980 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1e990 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1e9a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1e9b0 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1e9c0 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1e9d0 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d         munmap(p-
1e9e0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1e9f0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1ea00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ea10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1ea20 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
1ea30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ea40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1ea50 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1ea60 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1ea70 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1ea80 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
1ea90 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
1eaa0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
1eab0 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1eac0 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1ead0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1eae0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1eaf0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1eb00 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1eb10 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
1eb20 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1eb30 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
1eb40 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
1eb50 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
1eb60 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1eb70 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
1eb80 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
1eb90 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
1eba0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
1ebb0 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
1ebc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1ebd0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
1ebe0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
1ebf0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1ec00 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
1ec10 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
1ec20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1ec30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec40 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
1ec50 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
1ec60 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
1ec70 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
1ec80 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
1ec90 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1eca0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
1ecb0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
1ecc0 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
1ecd0 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
1ece0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
1ecf0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
1ed00 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
1ed10 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
1ed20 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
1ed30 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
1ed40 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1ed50 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
1ed60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ed70 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
1ed80 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
1ed90 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
1eda0 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
1edb0 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
1edc0 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
1edd0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
1ede0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
1edf0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
1ee00 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
1ee10 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
1ee20 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
1ee30 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
1ee40 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
1ee50 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
1ee60 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
1ee70 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
1ee80 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
1ee90 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
1eea0 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
1eeb0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1eec0 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
1eed0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1eee0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
1eef0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1ef00 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
1ef10 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1ef20 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1ef30 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
1ef40 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
1ef50 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
1ef60 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
1ef70 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
1ef80 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
1ef90 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
1efa0 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
1efb0 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
1efc0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
1efd0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
1efe0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
1eff0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1f000 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1f010 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
1f020 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1f030 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1f040 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
1f050 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
1f060 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
1f070 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
1f080 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
1f090 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
1f0a0 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
1f0b0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
1f0c0 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
1f0d0 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
1f0e0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
1f0f0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
1f100 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
1f110 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
1f120 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
1f130 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
1f140 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
1f150 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
1f160 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
1f170 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1f180 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
1f190 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
1f1a0 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
1f1b0 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
1f1c0 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
1f1d0 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
1f1e0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1f1f0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1f200 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1f210 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
1f220 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1f230 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1f240 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
1f250 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
1f260 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
1f270 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
1f280 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
1f290 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
1f2a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1f2b0 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
1f2c0 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
1f2d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f2e0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1f2f0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
1f300 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1f310 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
1f320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f330 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1f340 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1f350 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1f360 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
1f370 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1f380 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1f390 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1f3c0 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1f3d0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1f3e0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
1f3f0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
1f400 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f420 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1f430 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
1f440 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
1f450 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1f460 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1f470 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
1f480 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
1f490 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1f4a0 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
1f4b0 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
1f4c0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1f4d0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1f4e0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1f4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f500 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1f510 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1f520 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1f530 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1f540 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1f550 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1f560 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1f570 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
1f580 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1f590 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
1f5a0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1f5b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
1f5c0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1f5d0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1f5e0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1f5f0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
1f600 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1f610 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1f620 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1f630 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1f640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1f650 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
1f660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f670 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
1f680 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
1f690 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
1f6a0 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
1f6b0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
1f6c0 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
1f6d0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
1f6e0 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
1f6f0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
1f700 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
1f710 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
1f720 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
1f730 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
1f740 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
1f750 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
1f760 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
1f770 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
1f780 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1f790 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1f7a0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
1f7b0 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
1f7c0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1f7d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f7e0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1f7f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1f800 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1f810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1f820 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1f830 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1f840 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1f850 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b  DIRECTORY) + 31;
1f860 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1f870 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69  ilename = 6 + (i
1f880 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1f890 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1f8a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1f8b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1f8c0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1f8d0 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1f8e0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1f8f0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1f900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1f910 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1f920 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1f930 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1f940 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1f950 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d  (*pShmNode)+nShm
1f960 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
1f970 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53  ShmFilename = pS
1f980 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f990 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d  e = (char*)&pShm
1f9a0 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Node[1];.#ifdef 
1f9b0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f9c0 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33  TORY.    sqlite3
1f9d0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
1f9e0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
1f9f0 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1fa10 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1fa20 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
1fa30 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
1fa40 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
1fa50 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
1fa60 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
1fa70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
1fa80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1fa90 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1faa0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1fab0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1fac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
1fad0 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
1fae0 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e  zPath, zShmFilen
1faf0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ame);.#endif.   
1fb00 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
1fb10 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
1fb20 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
1fb30 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
1fb40 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
1fb50 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1fb60 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1fb70 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1fb80 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1fb90 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1fba0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1fbb0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1fbc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1fbd0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1fbe0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1fbf0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
1fc00 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
1fc10 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
1fc20 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f  nt openFlags = O
1fc30 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b  _RDWR | O_CREAT;
1fc40 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1fc50 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
1fc60 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
1fc70 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20  adonly_shm", 0) 
1fc80 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46  ){.        openF
1fc90 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
1fca0 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1fcb0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20  e->isReadonly = 
1fcc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1fcd0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
1fce0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46  obust_open(zShmF
1fcf0 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  ilename, openFla
1fd00 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f  gs, (sStat.st_mo
1fd10 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20  de&0777));.     
1fd20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1fd30 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
1fd40 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
1fd50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1fd60 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
1fd70 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1fd80 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68  KPT, "open", zSh
1fd90 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
1fda0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1fdb0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  pen_err;.       
1fdc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20   }.      }.  .  
1fdd0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1fde0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1fdf0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1fe00 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1fe10 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20  witch..      ** 
1fe20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1fe30 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1fe40 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20  o length. .     
1fe50 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1fe60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1fe70 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65  if( unixShmSyste
1fe80 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1fe90 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
1fea0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1feb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fec0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1fed0 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cate(pShmNode->h
1fee0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1fef0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
1ff00 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ff10 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e  _SHMOPEN, "ftrun
1ff20 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  cate", zShmFilen
1ff30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
1ff40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ff50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ff60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ff70 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1ff80 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44  k(pShmNode, F_RD
1ff90 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
1ffa0 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  S, 1);.      }. 
1ffb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1ffc0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1ffd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ffe0 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
1fff0 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
20000 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
20010 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
20020 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
20030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20040 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
20050 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
20060 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
20070 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
20080 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
20090 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
200a0 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
200b0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
200c0 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
200d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
200e0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
200f0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
20100 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
20110 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
20120 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
20130 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
20140 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
20150 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
20160 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
20170 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
20180 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
20190 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
201a0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
201b0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
201c0 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
201d0 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
201e0 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
201f0 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
20200 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
20210 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
20220 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
20230 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20240 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
20250 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
20260 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
20270 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
20280 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
20290 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
202a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
202b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
202c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
202d0 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
202e0 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
202f0 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67  r:.  unixShmPurg
20300 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20  e(pDbFd);       
20310 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
20320 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
20330 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
20340 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
20350 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
20360 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20370 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20380 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20390 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
203a0 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
203b0 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
203c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
203d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
203e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
203f0 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
20400 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
20410 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
20420 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
20430 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
20440 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
20450 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
20460 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
20470 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20480 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
20490 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
204a0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
204b0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
204c0 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78  wise, if the bEx
204d0 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  tend parameter i
204e0 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
204f0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
20500 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
20510 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
20520 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
20530 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
20540 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
20550 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
20560 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
20570 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
20580 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
20590 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78  rned. If .** bEx
205a0 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  tend is non-zero
205b0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
205c0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
205d0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
205e0 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
205f0 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
20600 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
20610 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
20620 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
20630 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
20640 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
20650 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
20660 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
20670 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
20680 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
20690 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
206a0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
206b0 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
206c0 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
206d0 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
206e0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
206f0 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
20700 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
20710 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
20720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20730 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  ixShmMap(.  sqli
20740 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
20750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
20760 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
20770 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
20780 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
207b0 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
207c0 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
207d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
207e0 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
207f0 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c  /.  int bExtend,
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
20820 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
20830 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
20840 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20860 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
20870 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ry */.){.  unixF
20880 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
20890 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
208a0 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78  ixShm *p;.  unix
208b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
208c0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
208d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
208e0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
208f0 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ory file has not
20900 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
20910 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
20920 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70  /.  if( pDbFd->p
20930 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Shm==0 ){.    rc
20940 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65   = unixOpenShare
20950 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
20960 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20970 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
20980 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44  c;.  }..  p = pD
20990 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68  bFd->pShm;.  pSh
209a0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
209b0 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ode;.  sqlite3_m
209c0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
209d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  ode->mutex);.  a
209e0 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d  ssert( szRegion=
209f0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67  =pShmNode->szReg
20a00 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ion || pShmNode-
20a10 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20  >nRegion==0 );. 
20a20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
20a30 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
20a40 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
20a50 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
20a60 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  h>=0 || pDbFd->p
20a70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
20a80 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
20a90 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  rt( pShmNode->h<
20aa0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
20ab0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
20ac0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
20ad0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20ae0 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
20af0 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
20b20 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
20b30 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
20b40 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
20b50 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
20b60 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
20b70 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
20b80 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ba0 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
20bb0 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
20bc0 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
20bd0 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
20be0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
20bf0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
20c00 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
20c10 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
20c20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
20c30 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
20c40 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
20c50 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
20c60 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
20c70 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
20c80 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
20c90 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
20ca0 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
20cb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
20cc0 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
20cd0 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
20ce0 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
20cf0 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
20d00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20d10 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
20d20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
20d30 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
20d40 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
20d50 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
20d60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
20d70 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
20d80 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
20d90 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
20da0 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
20db0 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
20dc0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
20dd0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
20de0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
20df0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
20e00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20e10 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
20e20 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
20e30 74 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63  true, use ftrunc
20e40 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
20e50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
20e60 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
20e70 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
20e80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20e90 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f   !bExtend ) goto
20ea0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20eb0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
20ec0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
20ed0 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ode->h, nByte) )
20ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20ef0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
20f00 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
20f10 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  ZE, "ftruncate",
20f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
20f40 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
20f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
20f60 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
20f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
20f90 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
20fa0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
20fb0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20fc0 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
20fd0 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
20fe0 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65   (char **)sqlite
20ff0 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
21000 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
21010 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
21020 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  1)*sizeof(char *
21030 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
21040 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
21050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
21060 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
21070 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
21080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
21090 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
210a0 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
210b0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  e(pShmNode->nReg
210c0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20  ion<=iRegion){. 
210d0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
210e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
210f0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
21100 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70       pMem = mmap
21110 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20  (0, szRegion,.  
21120 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
21130 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
21140 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
21150 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
21160 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
21170 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
21180 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e 6f 64  Node->h, pShmNod
21190 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67  e->nRegion*szReg
211a0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
211b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
211c0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
211d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
211e0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
211f0 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
21200 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
21210 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
21220 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
21230 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
21240 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
21250 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
21260 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
21270 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
21280 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b    if( pMem==0 ){
21290 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
212a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
212b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
212c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
212d0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
212e0 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65  et(pMem, 0, szRe
212f0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gion);.      }. 
21300 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
21310 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
21320 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d 65  ->nRegion] = pMe
21330 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  m;.      pShmNod
21340 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
21350 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
21360 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
21370 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
21380 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
21390 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
213a0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
213b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
213c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
213d0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
213e0 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
213f0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
21400 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
21410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21420 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
21430 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
21440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
21450 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
21460 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
21470 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
21480 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
21490 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
214a0 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
214b0 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
214c0 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
214d0 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
214e0 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
214f0 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
21500 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
21510 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
21520 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
21530 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
21540 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
21550 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
21560 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
21570 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
21580 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
21590 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
215a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
215b0 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
215c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
215d0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
215e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
215f0 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
21600 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
21610 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
21620 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
21630 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
21640 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
21650 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
21660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21670 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
21680 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
21690 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
216a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
216b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
216c0 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
216d0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
216e0 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
216f0 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
21700 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
21710 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
21720 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
21730 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21750 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
21760 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
21770 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
217a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
217b0 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
217c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
217d0 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
217e0 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
217f0 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
21800 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
21810 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21830 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
21840 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
21870 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
21880 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
21890 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
218a0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
218b0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
218c0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
218d0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
218e0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
218f0 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
21900 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
21910 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
21920 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
21930 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
21940 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
21950 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
21960 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
21970 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
21980 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
21990 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
219a0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
219b0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
219c0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
219d0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
219e0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
219f0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
21a00 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
21a10 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
21a20 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
21a30 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
21a40 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
21a50 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21a60 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
21a70 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
21a80 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
21a90 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
21aa0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
21ab0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
21ac0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
21ad0 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
21ae0 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
21af0 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
21b00 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
21b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
21b20 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
21b30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
21b40 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
21b50 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
21b60 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
21b70 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
21b80 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
21b90 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
21ba0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
21bb0 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
21bc0 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
21bd0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
21be0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
21bf0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
21c00 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
21c10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
21c20 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
21c30 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
21c40 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
21c50 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
21c60 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
21c70 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
21c80 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
21c90 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
21ca0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
21cb0 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
21cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
21cd0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
21ce0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
21cf0 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
21d00 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
21d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21d20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21d30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
21d40 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
21d50 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
21d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21d70 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
21d80 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
21d90 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
21da0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
21db0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
21dc0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
21dd0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
21de0 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
21df0 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
21e00 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
21e10 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
21e20 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
21e30 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
21e40 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
21e50 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
21e60 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
21e70 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
21e80 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
21e90 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
21ea0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
21eb0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
21ec0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
21ed0 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
21ee0 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
21ef0 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
21f00 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
21f10 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
21f20 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
21f30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
21f40 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
21f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21f60 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
21f70 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
21f80 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
21f90 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
21fa0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
21fb0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
21fc0 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
21fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21fe0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
21ff0 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
22000 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
22010 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
22020 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
22030 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
22040 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
22050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22060 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22070 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
22080 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
22090 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
220a0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
220b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
220c0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
220d0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
220e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
220f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
22100 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
22110 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
22120 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
22130 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
22140 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
22150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
22160 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
22170 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
22180 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
22190 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
221a0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
221b0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
221c0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
221d0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
221e0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
221f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
22200 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
22210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22220 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
22230 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
22240 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
22250 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
22260 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
22270 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
22280 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
22290 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
222a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
222b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
222c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
222d0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
222e0 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
222f0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
22300 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
22310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22320 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22330 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
22340 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
22350 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
22360 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
22370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22380 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22390 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
223a0 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
223b0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
223c0 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
223d0 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
223e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
223f0 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
22400 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
22410 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
22420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22430 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
22440 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
22450 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
22460 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
22470 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
22480 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
22490 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
224a0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
224b0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
224c0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
224d0 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
224e0 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
224f0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
22500 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
22510 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
22520 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
22530 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
22540 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
22550 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
22560 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
22570 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
22580 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
22590 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
225a0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
225b0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
225c0 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
225d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
225e0 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
225f0 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
22600 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
22610 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
22620 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
22630 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
22640 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
22650 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
22660 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
22670 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
22680 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
22690 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
226a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
226b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
226c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
226d0 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
22700 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
22710 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
22720 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
22730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22740 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
22750 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
22760 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
22770 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
22780 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
22790 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
227a0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
227b0 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
227c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
227d0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
227e0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
227f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
22800 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
22810 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
22820 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
22830 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
22840 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
22850 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
22860 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
22870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22880 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
22890 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
228a0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
228b0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
228c0 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
228d0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
228e0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
228f0 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
22900 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
22910 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
22920 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
22930 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
22940 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
22950 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22960 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
22970 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
22980 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
22990 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
229a0 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
229b0 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
229c0 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
229d0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
229e0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
229f0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
22a00 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
22a10 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
22a20 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
22a30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
22a40 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
22a50 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
22a60 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
22a70 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
22a80 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
22a90 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
22aa0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
22ab0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
22ac0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
22ad0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
22ae0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
22af0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
22b00 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
22b10 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73 55 6e  ode->h>=0 ) osUn
22b20 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  link(pShmNode->z
22b30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
22b40 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
22b50 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
22b60 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
22b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22b80 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
22b90 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
22ba0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
22bb0 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
22bc0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
22bd0 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
22be0 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
22bf0 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
22c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22c10 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48  _WAL */../*.** H
22c20 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
22c30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
22c40 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
22c50 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
22c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c70 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
22c80 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
22c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
22cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
22d00 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
22d10 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
22d20 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
22d30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22d40 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
22d50 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
22d60 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
22d70 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
22d80 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
22d90 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
22da0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
22db0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
22dc0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
22dd0 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
22de0 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
22df0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
22e00 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
22e10 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
22e20 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
22e30 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
22e40 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
22e50 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
22e60 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
22e70 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
22e80 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
22e90 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
22ea0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
22eb0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
22ec0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
22ed0 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
22ee0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
22ef0 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
22f00 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
22f10 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
22f20 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
22f30 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
22f40 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
22f50 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
22f60 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
22f70 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
22f80 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
22f90 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
22fa0 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
22fb0 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
22fc0 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
22fd0 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
22fe0 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
22ff0 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
23000 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
23010 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
23020 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
23030 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
23040 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
23050 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
23060 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
23070 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
23080 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
23090 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
230a0 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
230b0 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
230c0 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
230d0 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
230e0 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
230f0 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
23100 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
23110 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
23120 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
23130 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
23140 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
23150 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
23160 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
23170 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
23180 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
23190 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
231a0 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
231b0 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
231c0 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
231d0 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
231e0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
231f0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
23200 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
23210 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
23220 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
23230 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
23240 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
23250 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
23260 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
23270 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
23280 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
23290 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
232a0 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
232b0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
232c0 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
232d0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
232e0 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
232f0 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
23320 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
23330 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
23340 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
23370 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
23380 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23390 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
233c0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
233d0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
233e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
23410 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
23420 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
23430 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
23460 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
23470 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
23480 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
234b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
234c0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
23500 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
23510 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
23520 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23560 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
235e0 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23610 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23630 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
23640 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
23650 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
23660 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
23680 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
23690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
236a0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
236d0 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
236e0 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
236f0 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
23700 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
23710 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23720 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
23730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23740 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
23770 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
23780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
23790 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
237c0 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
237d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
237e0 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
23810 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  xShmUnmap       
23820 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
23830 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
238b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
238c0 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
238d0 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
238e0 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
238f0 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
23900 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
23910 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
23920 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
23950 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
239f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23a00 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
23a10 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
23a20 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
23a30 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
23a40 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
23a50 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
23a60 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
23a70 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
23a80 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
23a90 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
23aa0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
23ab0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
23ac0 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
23ad0 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
23ae0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
23af0 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
23b00 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
23b10 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
23b20 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
23b30 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
23b50 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
23b60 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
23b70 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
23b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
23b90 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
23ba0 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
23bb0 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
23bc0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23bd0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
23be0 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
23bf0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23c00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
23c10 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
23c20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
23c30 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
23c40 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23c50 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
23c60 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
23c70 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
23c80 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
23c90 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
23ca0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23cb0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
23cc0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
23cd0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23ce0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23cf0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23d20 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23d30 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
23d40 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23d50 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23d60 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
23d70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23d80 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23d90 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
23da0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23db0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23dc0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
23dd0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23de0 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
23df0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23e00 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
23e10 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
23e20 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
23e30 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
23e40 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
23e50 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
23e60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
23e70 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
23e80 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
23eb0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
23ec0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
23ed0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23ee0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
23ef0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
23f00 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23f10 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
23f20 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
23f30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23f40 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
23f50 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
23f60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
23f70 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
23f80 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
23f90 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
23fa0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23fb0 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
23fc0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
23fd0 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
23fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23ff0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
24000 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
24010 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24020 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
24030 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
24040 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
24070 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
24080 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240a0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
240b0 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240d0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
240e0 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24100 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
24110 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
24120 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
24130 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
24140 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
24150 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
24160 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
24170 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24190 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
241a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
241b0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
241c0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
241d0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
241e0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
24210 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
24220 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
24230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24240 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
24250 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
24280 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
24290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
242a0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
242b0 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
242c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
242d0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
242e0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
242f0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
24300 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24310 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
24320 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24330 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
24340 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
24350 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
24360 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
24370 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
24380 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
24390 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
243a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
243b0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243d0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
243e0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
243f0 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24410 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
24420 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24440 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
24450 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
24460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24470 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
24480 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
24490 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
244a0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
244b0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
244c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
244d0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
244e0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
244f0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
24500 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
24510 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
24520 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
24530 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
24540 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
24550 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
24560 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
24570 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
24580 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
24590 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
245a0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
245b0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
245c0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
245d0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
245e0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
245f0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
24600 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
24610 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
24620 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
24630 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
24640 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
24650 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
24660 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
24670 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
24680 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
24690 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
246a0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
246b0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
246c0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
246d0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
246e0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
246f0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
24700 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
24710 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
24720 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
24730 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
24740 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
24750 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
24760 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
24770 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
24780 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
24790 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
247a0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
247b0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
247c0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
247d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
247e0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
247f0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
24800 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
24810 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
24820 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
24840 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
24850 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
24860 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
24870 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
24880 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
24890 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
248a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
248b0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
248c0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
248d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
248e0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
248f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
24900 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
24910 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
24920 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
24930 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
24940 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
24950 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
24960 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
24970 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
24980 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
24990 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
249a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
249b0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
249c0 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
249e0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
249f0 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
24a00 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
24a10 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
24a20 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
24a30 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
24a60 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
24a70 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
24a80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24a90 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
24aa0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
24ab0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24ac0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
24ad0 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
24ae0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
24af0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
24b00 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
24b10 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
24b20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
24b30 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
24b40 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
24b50 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24b60 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24b70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24b80 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
24b90 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
24ba0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
24bb0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
24bc0 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
24bd0 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
24be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
24bf0 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
24c00 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
24c10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
24c20 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
24c30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
24c40 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
24c50 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
24c60 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
24c70 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
24c80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
24c90 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
24ca0 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
24cb0 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
24cc0 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
24cd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24ce0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
24cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
24d00 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
24d10 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
24d20 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
24d30 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
24d40 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
24d50 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
24d60 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
24d70 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
24d80 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
24d90 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
24da0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
24db0 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
24dc0 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
24dd0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
24de0 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
24df0 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
24e00 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
24e10 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
24e20 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
24e30 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
24e40 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
24e50 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
24e60 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
24e70 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
24e80 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
24e90 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
24ea0 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
24eb0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
24ec0 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
24ed0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
24ee0 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
24ef0 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
24f00 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
24f10 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
24f20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
24f30 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
24f40 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
24f50 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
24f60 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
24f70 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
24f80 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
24f90 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
24fa0 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
24fb0 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
24fc0 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
24fd0 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
24fe0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
24ff0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
25000 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
25010 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
25020 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
25030 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
25040 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
25050 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
25060 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25070 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
25080 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
25090 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
250a0 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
250b0 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
250c0 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
250d0 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
250e0 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
250f0 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
25100 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
25110 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
25120 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
25130 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
25140 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
25150 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
25160 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
25170 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
25180 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
25190 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
251a0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
251b0 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
251c0 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
251d0 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
251e0 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
251f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
25200 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
25210 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
25220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
25230 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
25240 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
25250 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
25260 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
25270 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
25280 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
25290 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
252a0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
252b0 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
252c0 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
252d0 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
252e0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
252f0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
25300 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
25310 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
25320 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
25330 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
25340 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
25350 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
25360 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
25370 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
25380 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
25390 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
253a0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
253b0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
253c0 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
253d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
253e0 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
253f0 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
25400 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
25410 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
25420 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
25430 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
25440 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
25450 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
25460 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
25470 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
25480 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
25490 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
254a0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
254b0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
254c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
254d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
254e0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
254f0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
25500 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
25510 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
25520 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
25530 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
25540 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
25550 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
25560 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
25570 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
25580 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
25590 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
255a0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
255b0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
255c0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
255d0 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
255e0 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
255f0 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
25600 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
25610 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
25620 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
25630 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
25640 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
25650 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
25660 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
25670 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
25680 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
25690 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
256a0 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
256b0 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
256c0 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
256d0 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
256e0 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
256f0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
25700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
25710 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
25720 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
25730 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25740 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
25750 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
25760 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
25770 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
25780 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
25790 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
257a0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
257b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
257c0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
257d0 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
257e0 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
257f0 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
25800 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
25810 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
25820 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
25830 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
25840 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
25850 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
25860 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
25870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
258a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
258b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
258c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
258d0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
258e0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
258f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
25900 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
25910 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
25920 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
25930 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
25940 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
25950 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
25960 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
25970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25980 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
25990 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
259a0 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
259b0 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
259c0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
259d0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
259e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
259f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
25a00 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
25a10 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
25a20 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
25a30 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
25a40 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  d */.  int syncD
25a50 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ir,            /
25a60 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63 20 64  * True to sync d
25a70 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69 72 73  irectory on firs
25a80 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71 6c 69  t sync */.  sqli
25a90 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
25aa0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
25ab0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
25ac0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
25ad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
25ae0 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
25af0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
25b00 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
25b10 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20  nt noLock,      
25b20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c         /* Omit l
25b30 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a  ocking if true *
25b40 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  /.  int isDelete
25b50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
25b60 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69  elete on close i
25b70 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
25b80 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20  isReadOnly      
25b90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
25ba0 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  he file is opene
25bb0 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 29  d read-only */.)
25bc0 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
25bd0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
25be0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
25bf0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
25c00 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
25c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25c20 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25c30 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
25c40 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  NULL );..  /* Pa
25c50 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74 65  rameter isDelete
25c60 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f 6e   is only used on
25c70 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65 73   vxworks. Expres
25c80 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74 6c  s this explicitl
25c90 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f 20  y .  ** here to 
25ca0 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
25cb0 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
25cc0 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
25cd0 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  s..  */.  UNUSED
25ce0 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65 6c  _PARAMETER(isDel
25cf0 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61  ete);..  /* Usua
25d00 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69  lly the path zFi
25d10 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f  lename should no
25d20 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20  t be a relative 
25d30 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20  pathname. The.  
25d40 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  ** exception is 
25d50 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
25d60 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66   proxy "conch" f
25d70 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68  ile in builds th
25d80 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20  at.  ** include 
25d90 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c  the special Appl
25da0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73  e locking styles
25db0 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
25dc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
25dd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
25de0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61  OCKING_STYLE.  a
25df0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
25e00 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
25e10 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c  [0]=='/' .    ||
25e20 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d   pVfs->pAppData=
25e30 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63  =(void*)&autoloc
25e40 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c  kIoFinder );.#el
25e50 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  se.  assert( zFi
25e60 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
25e70 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  lename[0]=='/' )
25e80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e  ;.#endif..  /* N
25e90 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73  o locking occurs
25ea0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69   in temporary fi
25eb0 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
25ec0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c   zFilename!=0 ||
25ed0 20 6e 6f 4c 6f 63 6b 20 29 3b 0a 0a 20 20 4f 53   noLock );..  OS
25ee0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
25ef0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
25f00 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
25f10 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
25f20 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  w->pVfs = pVfs;.
25f30 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20    pNew->zPath = 
25f40 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65  zFilename;.  pNe
25f50 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 30  w->ctrlFlags = 0
25f60 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
25f70 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
25f80 65 6e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  ename, "psow", S
25f90 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
25fa0 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
25fb0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
25fc0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53  s |= UNIXFILE_PS
25fd0 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  OW;.  }.  if( me
25fe0 6d 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  mcmp(pVfs->zName
25ff0 2c 22 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29  ,"unix-excl",10)
26000 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
26010 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
26020 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
26030 0a 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c  .  if( isReadOnl
26040 79 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  y ){.    pNew->c
26050 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
26060 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
26070 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29  .  if( syncDir )
26080 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
26090 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
260a0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a  E_DIRSYNC;.  }..
260b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
260c0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
260d0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
260e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
260f0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
26100 0a 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  .    noLock = 1;
26110 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26120 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
26130 69 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  if..  if( noLock
26140 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
26150 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
26160 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
26170 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
26180 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
26190 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
261a0 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
261b0 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
261c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
261d0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
261e0 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
261f0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
26200 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
26210 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
26220 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
26230 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
26240 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
26250 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
26260 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
26270 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
26280 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
26290 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
262a0 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
262b0 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
262c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
262d0 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
262e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
262f0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
26300 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
26310 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
26320 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
26330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
26340 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
26350 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
26360 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
26370 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20  .#endif.  ){.   
26380 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
26390 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
263a0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
263b0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
263c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
263d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
263e0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
263f0 63 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  cured in findIno
26400 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
26410 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
26420 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
26430 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
26440 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
26450 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
26460 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
26470 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
26480 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
26490 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
264a0 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
264b0 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
264c0 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
264d0 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
264e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
264f0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
26500 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
26510 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
26520 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
26530 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
26540 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
26550 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
26560 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
26570 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
26580 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
26590 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
265a0 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
265b0 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
265c0 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
265d0 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
265e0 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
265f0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
26600 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
26610 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
26620 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
26630 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
26640 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
26650 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
26660 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
26670 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
26680 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
26690 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
266a0 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
266b0 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
266c0 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
266d0 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
266e0 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
266f0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
26700 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
26710 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
26720 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
26730 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
26740 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
26750 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26760 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
26770 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
26780 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
26790 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
267a0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
267b0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
267c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
267d0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
267e0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
267f0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
26800 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
26810 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
26820 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
26830 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
26840 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
26850 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
26860 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
26870 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
26880 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
26890 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
268a0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
268b0 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
268c0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
268d0 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
268e0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
268f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26900 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
26910 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
26920 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
26930 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
26940 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
26950 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
26960 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
26970 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
26980 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
26990 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
269a0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
269b0 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
269c0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
269d0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
269e0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
269f0 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
26a00 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
26a10 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
26a20 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
26a30 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
26a40 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
26a50 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
26a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26a70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
26a80 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
26a90 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
26aa0 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
26ab0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
26ac0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
26ad0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
26ae0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
26af0 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
26b00 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
26b10 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
26b20 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
26b30 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
26b40 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
26b50 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
26b60 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
26b70 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
26b80 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
26b90 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
26ba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
26bb0 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
26bc0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
26bd0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
26be0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
26bf0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
26c00 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
26c10 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
26c20 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
26c30 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
26c40 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
26c50 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
26c60 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
26c70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26c80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
26c90 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26ca0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
26cb0 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
26cc0 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
26cd0 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
26ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
26cf0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
26d00 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
26d10 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
26d20 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
26d30 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
26d40 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
26d50 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
26d60 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
26d70 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
26d80 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
26d90 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
26da0 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
26db0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
26dc0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
26dd0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
26de0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
26df0 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
26e00 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
26e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
26e20 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
26e30 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
26e40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
26e50 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
26e60 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
26e70 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
26e80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26e90 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
26ea0 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
26eb0 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
26ed0 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
26ee0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
26ef0 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
26f00 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
26f10 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
26f20 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
26f30 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
26f40 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
26f50 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
26f60 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
26f70 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
26f80 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
26f90 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
26fa0 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
26fb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26fc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
26fd0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
26fe0 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
26ff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27000 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
27010 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
27020 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
27030 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
27040 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
27050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27060 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
27070 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
27080 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
27090 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
270a0 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
270b0 61 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65  ame);.    isDele
270c0 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  te = 0;.  }.  pN
270d0 65 77 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69  ew->isDelete = i
270e0 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a  sDelete;.#endif.
270f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27100 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
27110 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
27120 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
27130 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
27140 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
27150 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
27160 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
27170 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  er(+1);.  }.  re
27180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
271a0 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
271b0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
271c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
271d0 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
271e0 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
271f0 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
27200 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
27210 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
27220 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
27230 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
27240 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
27250 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
27260 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
27270 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
27280 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
27290 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
272a0 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
272b0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
272c0 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
272d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
272e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
272f0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
27300 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
27310 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
27320 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
27330 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
27340 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
27350 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
27360 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
27370 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
27380 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
27390 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
273a0 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
273b0 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
273c0 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
273d0 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
273e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
273f0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
27400 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
27410 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
27420 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
27430 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
27440 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
27450 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
27460 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
27470 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
27480 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
27490 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
274a0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
274b0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
274c0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
274d0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
274e0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
274f0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
27500 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
27510 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
27520 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
27530 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
27540 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
27550 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
27560 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
27570 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
27580 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
27590 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
275a0 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
275b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
275c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
275d0 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
275e0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
275f0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
27600 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
27610 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
27620 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
27630 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
27640 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
27650 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
27660 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
27670 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
27680 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
27690 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
276a0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
276b0 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
276c0 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
276d0 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
276e0 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
276f0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
27700 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
27710 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
27720 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
27730 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
27740 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
27750 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
27760 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
27770 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
27780 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
27790 52 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20  REFIX) + 17) >= 
277a0 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
277b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
277c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
277d0 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
277e0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
277f0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
27800 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
27810 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
27820 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
27830 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
27840 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
27850 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
27860 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
27870 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
27880 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
27890 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
278a0 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
278b0 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
278c0 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
278d0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
278e0 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
278f0 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
27900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27910 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
27920 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27930 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
27940 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
27950 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
27960 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
27970 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
27980 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
27990 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
279a0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
279b0 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
279c0 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
279d0 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
279e0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
279f0 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
27a00 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
27a10 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
27a20 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
27a30 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
27a40 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
27a50 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
27a60 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
27a70 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
27a80 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
27a90 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
27aa0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
27ab0 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
27ac0 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
27ad0 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
27ae0 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
27af0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
27b00 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
27b10 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
27b20 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
27b30 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
27b40 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
27b50 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27b60 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
27b70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
27b80 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
27b90 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
27ba0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
27bb0 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
27bc0 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
27bd0 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
27be0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
27bf0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
27c00 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
27c10 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
27c20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
27c30 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
27c40 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
27c50 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
27c60 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
27c70 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
27c80 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
27c90 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27ca0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
27cb0 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
27cc0 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
27cd0 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
27ce0 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
27cf0 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
27d00 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
27d10 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
27d20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
27d30 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
27d40 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27d50 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
27d60 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
27d70 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
27d80 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
27d90 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
27da0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
27db0 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
27dc0 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
27dd0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
27de0 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
27df0 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
27e00 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
27e10 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
27e20 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
27e30 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
27e40 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
27e50 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
27e60 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
27e70 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
27e80 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
27e90 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
27ea0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
27eb0 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
27ec0 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
27ed0 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
27ee0 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
27ef0 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
27f00 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
27f10 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
27f20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
27f30 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
27f40 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
27f50 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
27f60 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
27f70 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
27f80 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
27f90 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
27fa0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
27fb0 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
27fc0 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
27fd0 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
27fe0 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
27ff0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
28000 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
28010 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
28020 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
28030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
28040 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
28050 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
28060 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
28070 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
28080 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
28090 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
280a0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
280b0 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
280c0 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
280d0 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
280e0 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
280f0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
28100 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
28110 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
28120 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
28130 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
28140 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
28150 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
28160 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
28170 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
28180 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
28190 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
281a0 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
281b0 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
281c0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
281d0 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
281e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281f0 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
28200 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
28210 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
28220 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
28230 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
28240 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
28250 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
28260 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
28270 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
28280 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
28290 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
282a0 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
282b0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
282c0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
282d0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
282e0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
282f0 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
28300 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
28310 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
28320 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
28330 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
28340 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
28350 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
28360 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
28370 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
28380 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
28390 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
283a0 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
283b0 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
283c0 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
283d0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
283e0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
283f0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
28400 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
28410 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
28420 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
28430 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
28440 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
28450 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
28460 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
28470 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
28480 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
28490 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
284a0 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
284b0 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
284c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
284d0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
284e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
284f0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
28500 63 72 65 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  created with.** 
28510 74 68 65 20 6f 63 74 61 6c 20 70 65 72 6d 69 73  the octal permis
28520 73 69 6f 6e 73 20 30 36 30 30 20 28 72 65 61 64  sions 0600 (read
28530 2f 77 72 69 74 61 62 6c 65 20 62 79 20 6f 77 6e  /writable by own
28540 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20 74 68 65  er only). If the
28550 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 20 64 61   file.** is a da
28560 74 61 62 61 73 65 20 6f 72 20 6d 61 73 74 65 72  tabase or master
28570 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 69   journal file, i
28580 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
28590 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
285a0 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51 4c 49 54  s .** mask SQLIT
285b0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
285c0 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a  ERMISSIONS..**.*
285d0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  * Finally, if th
285e0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
285f0 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
28600 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
28610 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
28620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
28630 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
28640 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
28650 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
28660 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
28670 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
28680 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
28690 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
286a0 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
286b0 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
286c0 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
286d0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
286e0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
286f0 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
28700 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
28710 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
28720 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
28730 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
28740 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
28750 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
28760 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
28770 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
28780 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
28790 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
287a0 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
287b0 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
287c0 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
287d0 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
287e0 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
287f0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
28800 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
28810 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
28820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28830 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
28840 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
28850 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
28860 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
28870 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
288a0 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
288b0 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
288c0 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20  mode_t *pMode   
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
288f0 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
28900 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e   with */.){.  in
28910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
28920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28930 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
28940 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51 4c 49 54    *pMode = SQLIT
28950 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
28960 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 69 66  ERMISSIONS;.  if
28970 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
28980 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
28990 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
289a0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
289b0 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
289c0 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
289d0 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
289e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28a10 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
28a20 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
28a30 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
28a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28a50 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
28a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28a70 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
28a80 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
28a90 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
28aa0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
28ab0 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
28ac0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
28ad0 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
28ae0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
28af0 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
28b00 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
28b10 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
28b20 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
28b30 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
28b40 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28b50 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
28b60 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
28b70 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
28b80 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
28b90 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
28ba0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
28bb0 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
28bc0 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
28bd0 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
28be0 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
28bf0 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
28c00 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
28c10 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
28c20 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
28c30 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
28c40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
28c50 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
28c60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28c70 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
28c80 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
28c90 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
28ca0 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
28cb0 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
28cc0 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
28cd0 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
28ce0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
28cf0 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
28d00 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
28d10 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
28d20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
28d30 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
28d40 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
28d50 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
28d60 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
28d70 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
28d80 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
28d90 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
28da0 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
28db0 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
28dc0 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
28dd0 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 7d 65  e & 0777;.    }e
28de0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
28df0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
28e00 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AT;.    }.  }els
28e10 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
28e20 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
28e30 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a  ONCLOSE ){.    *
28e40 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20  pMode = 0600;.  
28e50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28e60 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
28e70 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20   file zPath..** 
28e80 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20  .** Previously, 
28e90 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61  the SQLite OS la
28ea0 79 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66  yer used three f
28eb0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63  unctions in plac
28ec0 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65  e of this.** one
28ed0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
28ee0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
28ef0 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  te();.**     sql
28f00 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
28f10 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c  ly();.**     sql
28f20 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
28f30 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ive();.**.** The
28f40 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70  se calls corresp
28f50 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ond to the follo
28f60 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
28f70 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  s of flags:.**.*
28f80 2a 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28  *     ReadWrite(
28f90 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52  ) ->     (READWR
28fa0 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a  ITE | CREATE).**
28fb0 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20       ReadOnly() 
28fc0 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c   ->     (READONL
28fd0 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45  Y) .**     OpenE
28fe0 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52  xclusive() -> (R
28ff0 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
29000 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a  E | EXCLUSIVE).*
29010 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65  *.** The old Ope
29020 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63  nExclusive() acc
29030 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20  epted a boolean 
29040 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46  argument - "delF
29050 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65  lag". If.** true
29060 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63  , the file was c
29070 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20  onfigured to be 
29080 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
29090 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  leted when the.*
290a0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c  * file handle cl
290b0 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65  osed. To achieve
290c0 20 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74   the same effect
290d0 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20   using this new 
290e0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61  .** interface, a
290f0 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43  dd the DELETEONC
29100 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f  LOSE flag to tho
29110 73 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f  se specified abo
29120 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45  ve for .** OpenE
29130 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73  xclusive()..*/.s
29140 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
29150 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
29160 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
29170 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f     /* The VFS fo
29180 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
29190 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64  the xOpen method
291a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
291b0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
291c0 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f     /* Pathname o
291d0 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65  f file to be ope
291e0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
291f0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
29200 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
29210 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
29220 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a  be filled in */.
29230 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29250 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f  * Input flags to
29260 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65   control the ope
29270 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ning */.  int *p
29280 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
29290 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
292a0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
292b0 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  to SQLite core *
292c0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
292d0 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  *p = (unixFile *
292e0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64  )pFile;.  int fd
292f0 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
29300 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
29310 20 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75   descriptor retu
29320 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a  rned by open() *
29330 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
29340 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
29350 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
29360 61 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f  ass to open() */
29370 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
29380 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
29390 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
293a0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
293b0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293d0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
293e0 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
293f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
29400 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29410 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
29420 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
29430 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
29440 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
29450 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
29460 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
29470 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
29480 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
29490 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
294a0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
294b0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
294c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
294d0 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
294e0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
294f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
29500 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
29510 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
29520 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
29530 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23  EN_READWRITE);.#
29540 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
29550 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
29560 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79   int isAutoProxy
29570 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
29580 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
29590 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  XY);.#endif.#if 
295a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
295b0 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
295c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
295d0 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  E.  struct statf
295e0 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66  s fsInfo;.#endif
295f0 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69  ..  /* If creati
29600 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d  ng a master or m
29610 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  ain-file journal
29620 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
29630 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  will open.  ** a
29640 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
29650 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   on the director
29660 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74  y too. The first
29670 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29   time unixSync()
29680 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
29690 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  the directory fi
296a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
296b0 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20  ll be fsync()ed 
296c0 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20  and close()d..  
296d0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
296e0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
296f0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
29700 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
29710 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
29720 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29730 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29740 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
29750 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29760 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
29770 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
29780 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
29790 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
297a0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
297b0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
297c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
297d0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
297e0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
297f0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
29800 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
29810 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
29820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
29830 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
29840 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
29850 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
29860 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
29870 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
29880 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
29890 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
298a0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
298b0 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
298c0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
298d0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
298e0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
298f0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
29900 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
29910 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
29920 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
29930 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
29940 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
29950 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
29960 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
29970 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
29980 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
29990 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
299a0 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
299b0 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
299c0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
299d0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
299e0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
299f0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
29a00 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
29a10 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
29a20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
29a30 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
29a40 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
29a50 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
29a60 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
29a70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
29a80 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
29a90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
29aa0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
29ab0 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
29ac0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
29ad0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
29ae0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
29af0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29b00 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
29b10 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
29b20 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
29b30 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29b40 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
29b50 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
29b60 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
29b70 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
29b80 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
29b90 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
29ba0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
29bb0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
29bc0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
29bd0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
29be0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
29bf0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
29c00 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
29c10 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
29c20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
29c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29c40 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
29c50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
29c60 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
29c70 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
29c80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
29c90 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
29ca0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
29cb0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
29cc0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29cd0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
29ce0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29cf0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
29d00 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
29d10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
29d20 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
29d30 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29d40 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
29d50 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
29d60 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
29d70 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
29d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29d90 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
29da0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
29db0 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
29dc0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
29dd0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
29de0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
29df0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
29e00 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
29e10 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
29e20 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
29e30 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73  oc(sizeof(*pUnus
29e40 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ed));.      if( 
29e50 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
29e60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29e70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
29e80 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55  .    }.    p->pU
29e90 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
29ea0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e  .  }else if( !zN
29eb0 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ame ){.    /* If
29ec0 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20   zName is NULL, 
29ed0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
29ee0 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  is requesting a 
29ef0 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  temp file. */.  
29f00 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
29f10 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a  e && !syncDir);.
29f20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
29f30 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
29f40 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d  HNAME+1, zTmpnam
29f50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
29f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29f70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29f80 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
29f90 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
29fa0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
29fb0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
29fc0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
29fd0 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
29fe0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
29ff0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
2a000 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
2a010 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
2a020 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
2a030 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
2a040 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2a050 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
2a060 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
2a070 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
2a080 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
2a090 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
2a0a0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
2a0b0 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
2a0c0 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2a0d0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
2a0e0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2a0f0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
2a100 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
2a110 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
2a120 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
2a130 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
2a140 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
2a150 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
2a160 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
2a170 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
2a180 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2a190 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
2a1a0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2a1b0 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
2a1c0 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
2a1d0 69 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ith */.    rc = 
2a1e0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
2a1f0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
2a200 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20   &openMode);.   
2a210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2a230 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20  rt( !p->pUnused 
2a240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a250 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2a260 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65  PEN_WAL || eType
2a270 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2a280 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2a290 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a2a0 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f     }.    fd = ro
2a2b0 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2a2c0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2a2d0 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  Mode);.    OSTRA
2a2e0 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33  CE(("OPENX   %-3
2a2f0 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c  d %s 0%o\n", fd,
2a300 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67   zName, openFlag
2a310 73 29 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  s));.    if( fd<
2a320 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
2a330 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
2a340 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
2a350 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
2a360 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
2a370 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
2a380 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
2a390 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
2a3a0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
2a3b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2a3c0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2a3d0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
2a3e0 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
2a3f0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
2a400 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
2a410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2a420 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
2a430 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
2a440 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
2a450 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
2a460 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2a470 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
2a480 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
2a490 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
2a4a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2a4b0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2a4c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
2a4d0 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
2a4e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
2a4f0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
2a500 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
2a510 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
2a520 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
2a530 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
2a540 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
2a550 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
2a560 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
2a570 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
2a580 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
2a590 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
2a5a0 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
2a5b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
2a5c0 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
2a5d0 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
2a5e0 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
2a5f0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
2a600 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a610 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
2a620 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
2a630 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
2a640 64 69 66 0a 0a 23 69 66 64 65 66 20 46 44 5f 43  dif..#ifdef FD_C
2a650 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74 6c  LOEXEC.  osFcntl
2a660 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
2a670 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
2a680 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
2a690 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e  EC);.#endif..  n
2a6a0 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53  oLock = eType!=S
2a6b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a6c0 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69  DB;..  .#if defi
2a6d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
2a6e0 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2a6f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2a700 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
2a710 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
2a720 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
2a730 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
2a740 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
2a750 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
2a760 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
2a770 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a780 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
2a790 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
2a7a0 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20  trncmp("msdos", 
2a7b0 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2a7c0 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
2a7d0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2a7e0 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
2a7f0 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2a800 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
2a810 66 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.  .#if SQLITE_
2a820 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a830 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
2a840 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2a850 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
2a860 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
2a870 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
2a880 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
2a890 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
2a8a0 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
2a8b0 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
2a8c0 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
2a8d0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2a8e0 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
2a8f0 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
2a900 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
2a910 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2a920 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
2a930 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
2a940 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
2a950 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
2a960 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
2a970 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
2a980 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
2a990 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
2a9a0 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
2a9b0 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
2a9c0 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
2a9d0 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
2a9e0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  {.      if( stat
2a9f0 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
2aa00 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2aa10 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
2aa20 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20  , the close(fd) 
2aa30 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69  call is sub-opti
2aa40 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65  mal. If the file
2aa50 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20   opened.        
2aa60 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20  ** with fd is a 
2aa70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2aa80 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  nd there are oth
2aa90 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  er connections o
2aaa0 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2aab0 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
2aac0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68   are currently h
2aad0 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20  olding advisory 
2aae0 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20  locks on it,.   
2aaf0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2ab00 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
2ab10 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f   will cancel tho
2ab20 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61  se locks. In pra
2ab30 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a  ctice,.        *
2ab40 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
2ab50 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64   that statfs() d
2ab60 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79  oesn't fail very
2ab70 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74   often. At least
2ab80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2ab90 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65  while other file
2aba0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2abb0 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
2abc0 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20  process on.     
2abd0 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66     ** the same f
2abe0 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e  ile are working.
2abf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e    */.        p->
2ac00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2ac10 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  o;.        robus
2ac20 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2ac30 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2ac40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2ac50 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
2ac60 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2ac70 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
2ac80 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2ac90 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
2aca0 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
2acb0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
2acc0 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
2acd0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2ace0 65 28 70 56 66 73 2c 20 66 64 2c 20 73 79 6e 63  e(pVfs, fd, sync
2acf0 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74  Dir, pFile, zPat
2ad00 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20  h, noLock,.     
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 20 20 20 20 20 69 73 44 65 6c 65 74 65 2c 20 69       isDelete, i
2ad30 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20  sReadonly);.    
2ad40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ad50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2ad60 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
2ad70 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
2ad80 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
2ad90 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
2ada0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2adb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
2adc0 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
2add0 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
2ade0 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
2adf0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
2ae00 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
2ae10 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
2ae20 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
2ae30 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
2ae40 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
2ae50 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
2ae60 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
2ae70 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
2ae80 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
2ae90 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
2aea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
2aeb0 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
2aec0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2aed0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2aee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
2aef0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2af00 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2af10 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  f.  .  rc = fill
2af20 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c  InUnixFile(pVfs,
2af30 20 66 64 2c 20 73 79 6e 63 44 69 72 2c 20 70 46   fd, syncDir, pF
2af40 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f  ile, zPath, noLo
2af50 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
2af60 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c 65            isDele
2af70 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b  te, isReadonly);
2af80 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
2af90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2afa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2afb0 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
2afc0 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
2afd0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2afe0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
2aff0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
2b000 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
2b010 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
2b020 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
2b030 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
2b040 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
2b050 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
2b060 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2b070 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
2b080 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
2b090 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
2b0a0 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
2b0b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b0c0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
2b0d0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2b0e0 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
2b0f0 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
2b100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b110 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
2b120 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
2b130 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
2b140 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2b150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
2b160 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2b170 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
2b180 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
2b190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2b1a0 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
2b1b0 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
2b1c0 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e 4f 45  ) && errno!=ENOE
2b1d0 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  NT ){.    return
2b1e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2b1f0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2b200 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
2b210 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  th);.  }.#ifndef
2b220 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2b230 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
2b240 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
2b250 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
2b260 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
2b270 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
2b280 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2b290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
2b2a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2b2b0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
2b2c0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
2b2d0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
2b2e0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
2b2f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2b300 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2b310 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
2b320 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
2b330 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
2b340 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2b350 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2b360 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
2b370 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
2b380 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
2b390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b3a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2b3b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b3c0 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
2b3d0 74 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tance of or acce
2b3e0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
2b3f0 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
2b400 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
2b410 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
2b420 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
2b430 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
2b440 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2b450 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
2b460 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
2b470 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2b480 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
2b490 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2b4a0 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
2b4b0 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
2b4c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2b4d0 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
2b4e0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
2b4f0 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
2b500 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
2b510 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
2b520 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
2b530 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
2b540 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
2b550 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
2b560 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
2b570 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2b580 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2b590 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
2b5a0 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
2b5b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2b5d0 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
2b5e0 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
2b5f0 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
2b600 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
2b610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2b620 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
2b630 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
2b640 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
2b650 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b660 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
2b670 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2b680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2b690 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
2b6a0 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
2b6b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2b6c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
2b6d0 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
2b6e0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2b6f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2b700 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
2b710 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
2b720 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
2b730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2b740 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2b750 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
2b760 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
2b770 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
2b780 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
2b790 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
2b7a0 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
2b7b0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
2b7c0 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
2b7d0 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66  amode)==0);.  if
2b7e0 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
2b7f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26  ACCESS_EXISTS &&
2b800 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
2b810 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2b820 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ;.    if( 0==osS
2b830 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
2b840 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d   && buf.st_size=
2b850 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  =0 ){.      *pRe
2b860 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  sOut = 0;.    }.
2b870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2b880 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
2b890 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
2b8a0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
2b8b0 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
2b8c0 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
2b8d0 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
2b8e0 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
2b8f0 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
2b900 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
2b910 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
2b920 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
2b930 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
2b940 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
2b950 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
2b960 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
2b970 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
2b980 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
2b990 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
2b9a0 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
2b9b0 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
2b9c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
2b9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b9e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
2b9f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ba00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2ba10 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2ba20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2ba30 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2ba40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2ba50 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
2ba60 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
2ba70 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ba90 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
2baa0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
2bab0 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bad0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
2bae0 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
2baf0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2bb00 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2bb10 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2bb20 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2bb30 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2bb40 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2bb50 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2bb60 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2bb70 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2bb80 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
2bb90 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
2bba0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
2bbb0 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
2bbc0 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
2bbd0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2bbe0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
2bbf0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2bc00 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2bc10 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
2bc20 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
2bc30 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
2bc40 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
2bc50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2bc60 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
2bc70 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
2bc80 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
2bc90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2bca0 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
2bcb0 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
2bcc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
2bcd0 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
2bce0 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
2bcf0 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
2bd00 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
2bd10 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2bd20 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
2bd30 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
2bd40 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
2bd50 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
2bd60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
2bd70 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
2bd80 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
2bd90 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
2bda0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2bdb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
2bdc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
2bdd0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
2bde0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
2bdf0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
2be00 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
2be10 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
2be20 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
2be30 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
2be40 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
2be50 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
2be60 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
2be70 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
2be80 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
2be90 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2bea0 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
2beb0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
2bec0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2bed0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
2bee0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
2bef0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
2bf00 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
2bf10 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
2bf20 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
2bf30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
2bf40 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
2bf50 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
2bf60 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
2bf70 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
2bf80 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
2bf90 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
2bfa0 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
2bfb0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
2bfc0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
2bfd0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
2bfe0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
2bff0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
2c000 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
2c010 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
2c020 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
2c030 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
2c040 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2c050 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
2c060 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2c070 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2c080 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
2c090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
2c0a0 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
2c0b0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2c0c0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2c0d0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
2c0e0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
2c0f0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
2c100 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
2c110 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
2c120 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
2c130 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
2c140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
2c150 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
2c160 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
2c170 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
2c180 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
2c190 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
2c1a0 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
2c1b0 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
2c1c0 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
2c1d0 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
2c1e0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
2c1f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
2c200 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
2c210 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
2c220 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
2c230 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
2c240 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
2c250 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
2c260 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
2c270 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
2c280 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
2c290 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
2c2a0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
2c2b0 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
2c2c0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
2c2d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
2c2e0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
2c2f0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
2c300 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
2c310 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
2c320 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2c330 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
2c340 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
2c350 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
2c360 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2c370 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
2c380 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
2c390 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
2c3a0 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
2c3b0 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
2c3c0 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
2c3d0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
2c3e0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
2c3f0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
2c400 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
2c410 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
2c420 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
2c430 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
2c440 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
2c450 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
2c460 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
2c470 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
2c480 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
2c490 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
2c4a0 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
2c4b0 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
2c4c0 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
2c4d0 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
2c4e0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
2c4f0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
2c500 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
2c510 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c520 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
2c530 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
2c540 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
2c550 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
2c560 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
2c570 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
2c580 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
2c590 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2c5a0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
2c5b0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
2c5c0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c5d0 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
2c5e0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
2c5f0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
2c600 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
2c610 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
2c620 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
2c630 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
2c640 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
2c650 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
2c660 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
2c670 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
2c680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
2c690 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
2c6a0 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
2c6b0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
2c6c0 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
2c6d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
2c6e0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
2c6f0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
2c700 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2c710 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
2c720 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2c730 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
2c740 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
2c750 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
2c760 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
2c770 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
2c780 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
2c790 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
2c7a0 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
2c7b0 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
2c7c0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
2c7d0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
2c7e0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
2c7f0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
2c800 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
2c810 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
2c820 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
2c830 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
2c840 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
2c850 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
2c860 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
2c870 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
2c880 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
2c890 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
2c8a0 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
2c8b0 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
2c8c0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
2c8d0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
2c8e0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
2c8f0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
2c900 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
2c910 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
2c920 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
2c930 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
2c940 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
2c950 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
2c960 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
2c970 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
2c980 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
2c990 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
2c9a0 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
2c9b0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
2c9c0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
2c9d0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
2c9e0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
2c9f0 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  f);.#if !defined
2ca00 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
2ca10 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66  {.    int pid, f
2ca20 64 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  d;.    fd = robu
2ca30 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
2ca40 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
2ca50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
2ca60 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
2ca70 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
2ca80 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
2ca90 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
2caa0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
2cab0 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
2cac0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
2cad0 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70  f[sizeof(t)], &p
2cae0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
2caf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cb00 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66  sizeof(t)+sizeof
2cb10 28 70 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e  (pid)<=(size_t)n
2cb20 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75  Buf );.      nBu
2cb30 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20  f = sizeof(t) + 
2cb40 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20  sizeof(pid);.   
2cb50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
2cb60 7b 20 6e 42 75 66 20 3d 20 6f 73 52 65 61 64 28  { nBuf = osRead(
2cb70 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b  fd, zBuf, nBuf);
2cb80 20 7d 77 68 69 6c 65 28 20 6e 42 75 66 3c 30 20   }while( nBuf<0 
2cb90 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
2cba0 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
2cbb0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2cbc0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
2cbd0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2cbe0 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
2cbf0 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
2cc00 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
2cc10 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
2cc20 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
2cc30 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
2cc40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2cc50 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
2cc60 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
2cc70 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2cc80 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2cc90 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
2cca0 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
2ccb0 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
2ccc0 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
2ccd0 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
2cce0 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
2ccf0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
2cd00 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
2cd10 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
2cd20 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
2cd30 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
2cd40 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
2cd50 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
2cd60 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
2cd70 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
2cd80 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
2cd90 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2cda0 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
2cdb0 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
2cdc0 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
2cdd0 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
2cde0 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
2cdf0 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
2ce00 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
2ce10 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
2ce20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ce30 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2ce40 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2ce50 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
2ce60 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
2ce70 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
2ce80 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
2ce90 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
2cea0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2ceb0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
2cec0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
2ced0 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
2cee0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
2cef0 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
2cf00 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
2cf10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cf20 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
2cf30 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
2cf40 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
2cf50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2cf60 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2cf70 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2cf80 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2cf90 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2cfa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2cfb0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2cfc0 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2cfd0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2cfe0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2cff0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2d000 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2d010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2d020 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2d030 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2d040 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2d050 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2d060 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2d070 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2d080 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2d090 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2d0a0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2d0b0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2d0c0 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2d0d0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2d0e0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2d0f0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2d100 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2d110 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2d120 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2d130 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2d140 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2d150 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2d160 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2d170 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2d180 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2d190 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2d1a0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2d1b0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2d1c0 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2d1d0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2d1e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2d1f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2d200 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2d210 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
2d220 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2d230 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
2d240 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
2d250 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2d260 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
2d270 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
2d280 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2d290 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
2d2a0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
2d2b0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2d2c0 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
2d2d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
2d2e0 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
2d2f0 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
2d300 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
2d310 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
2d320 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
2d330 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
2d340 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
2d350 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
2d360 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
2d370 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
2d380 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
2d390 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
2d3a0 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
2d3b0 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
2d3c0 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
2d3d0 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
2d3e0 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
2d3f0 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74   sNow;.  if( get
2d400 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
2d410 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70   0)==0 ){.    *p
2d420 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68  iNow = unixEpoch
2d430 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   + 1000*(sqlite3
2d440 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73  _int64)sNow.tv_s
2d450 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  ec + sNow.tv_use
2d460 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b  c/1000;.  }else{
2d470 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d480 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64  _ERROR;.  }.#end
2d490 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
2d4a0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2d4b0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2d4c0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2d4d0 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2d4e0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2d4f0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2d500 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2d510 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2d520 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2d530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d540 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2d550 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2d560 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2d570 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2d580 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
2d590 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2d5a0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2d5b0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
2d5c0 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
2d5d0 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
2d5e0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2d5f0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
2d600 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2d610 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
2d620 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
2d630 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20  NotUsed, double 
2d640 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74  *prNow){.  sqlit
2d650 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a  e3_int64 i = 0;.
2d660 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53    int rc;.  UNUS
2d670 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2d680 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e  Used);.  rc = un
2d690 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
2d6a0 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72  64(0, &i);.  *pr
2d6b0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
2d6c0 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .0;.  return rc;
2d6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64  .}../*.** We add
2d6e0 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45  ed the xGetLastE
2d6f0 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69  rror() method wi
2d700 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e  th the intention
2d710 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a   of providing.**
2d720 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65   better low-leve
2d730 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
2d740 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
2d750 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
2d760 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
2d770 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
2d780 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c  on.  But so far,
2d790 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61   none of that ha
2d7a0 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
2d7b0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ed.** in the cor
2d7c0 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  e.  So this rout
2d7d0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
2d7e0 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69  led.  For now, i
2d7f0 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61  t is merely.** a
2d800 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a   place-holder..*
2d810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2d820 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
2d830 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2d840 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
2d850 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
2d860 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d870 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2d880 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2d890 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
2d8a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d8b0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
2d8c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
2d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d8e0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
2d8f0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
2d900 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
2d910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
2d970 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2d980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2d9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
2d9e0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
2d9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2da10 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
2da20 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
2da30 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
2da40 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
2da50 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
2da60 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
2da70 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
2da80 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
2da90 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
2daa0 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
2dab0 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
2dac0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
2dad0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
2dae0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
2daf0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
2db00 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
2db10 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
2db20 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
2db30 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
2db40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
2db50 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
2db60 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
2db70 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
2db80 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
2db90 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
2dba0 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
2dbb0 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
2dbc0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
2dbd0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
2dbe0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2dbf0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2dc00 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
2dc10 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
2dc20 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
2dc30 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
2dc40 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
2dc50 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2dc60 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
2dc70 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
2dc80 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
2dc90 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
2dca0 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
2dcb0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
2dcc0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
2dcd0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
2dce0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
2dcf0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
2dd00 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
2dd10 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
2dd20 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
2dd30 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
2dd40 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
2dd50 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
2dd60 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
2dd70 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
2dd80 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
2dd90 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
2dda0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2ddb0 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
2ddc0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
2ddd0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
2dde0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
2ddf0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
2de00 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
2de10 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
2de20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
2de30 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
2de40 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
2de50 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
2de60 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
2de70 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2de80 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
2de90 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
2dea0 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
2deb0 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
2dec0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
2ded0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
2dee0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
2def0 30 78 34 30 30 30 30 30 30 30 09 09 20 20 20 09  0x40000000..   .
2df00 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
2df10 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
2df20 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
2df30 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
2df40 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
2df50 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
2df60 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
2df70 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
2df80 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
2df90 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
2dfa0 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
2dfb0 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
2dfc0 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
2dfd0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
2dfe0 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
2dff0 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
2e000 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
2e010 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
2e020 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
2e030 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
2e040 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
2e050 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
2e060 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
2e070 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
2e080 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
2e090 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
2e0a0 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
2e0b0 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
2e0c0 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
2e0d0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
2e0e0 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
2e0f0 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
2e100 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
2e110 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
2e120 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
2e130 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
2e140 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
2e150 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
2e160 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
2e170 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
2e180 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
2e190 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
2e1a0 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
2e1b0 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
2e1c0 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
2e1d0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
2e1e0 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
2e1f0 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
2e200 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
2e210 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
2e220 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
2e230 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
2e240 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
2e250 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
2e260 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
2e270 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
2e280 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
2e290 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
2e2a0 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
2e2b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e2c0 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
2e2d0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
2e2e0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
2e2f0 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
2e300 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
2e310 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
2e320 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
2e330 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
2e340 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
2e350 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
2e360 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
2e370 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
2e390 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
2e3a0 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
2e3b0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2e3c0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2e3d0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
2e3e0 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
2e3f0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
2e400 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
2e410 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
2e420 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
2e430 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
2e440 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
2e450 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
2e460 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
2e470 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
2e480 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
2e490 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
2e4a0 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
2e4b0 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
2e4c0 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
2e4d0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
2e4e0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
2e4f0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
2e500 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
2e510 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
2e520 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
2e530 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
2e540 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
2e550 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
2e560 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
2e570 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
2e580 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
2e590 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
2e5a0 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
2e5b0 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
2e5c0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2e5d0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
2e5e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
2e5f0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
2e600 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
2e610 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
2e620 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
2e630 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
2e640 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
2e650 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
2e660 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
2e670 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
2e680 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
2e690 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2e6a0 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
2e6b0 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
2e6c0 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
2e6d0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
2e6e0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
2e6f0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
2e700 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
2e710 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2e720 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
2e730 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
2e740 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
2e750 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
2e760 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
2e770 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
2e780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e790 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
2e7a0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
2e7b0 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
2e7c0 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
2e7d0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
2e7e0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
2e7f0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
2e800 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
2e810 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
2e820 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
2e830 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
2e840 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
2e850 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
2e860 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
2e870 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
2e880 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
2e890 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e8a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
2e8b0 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
2e8c0 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
2e8d0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
2e8e0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
2e8f0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
2e900 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
2e910 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2e920 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
2e930 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
2e940 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
2e950 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
2e960 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
2e970 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
2e980 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
2e990 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
2e9a0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
2e9b0 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
2e9c0 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
2e9d0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
2e9e0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
2e9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2ea00 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
2ea10 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
2ea20 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
2ea30 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
2ea40 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
2ea50 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
2ea60 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
2ea70 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
2ea80 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
2ea90 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
2eaa0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
2eab0 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
2eac0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
2ead0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
2eae0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
2eaf0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
2eb00 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
2eb10 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
2eb20 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
2eb30 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
2eb40 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
2eb50 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
2eb60 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
2eb70 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
2eb80 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
2eb90 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
2eba0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
2ebb0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2ebc0 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
2ebd0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
2ebe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2ebf0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
2ec00 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
2ec10 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
2ec20 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
2ec30 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
2ec40 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
2ec50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ec60 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
2ec70 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
2ec80 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
2ec90 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
2eca0 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
2ecb0 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
2ecc0 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
2ecd0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
2ece0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
2ecf0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
2ed00 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
2ed10 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
2ed20 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
2ed30 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
2ed40 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
2ed50 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
2ed60 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
2ed70 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
2ed80 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
2ed90 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
2eda0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
2edb0 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
2edc0 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
2edd0 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
2ede0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
2edf0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
2ee00 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
2ee10 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
2ee20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
2ee30 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
2ee40 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
2ee50 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2ee60 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
2ee70 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
2ee80 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
2ee90 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
2eea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
2eeb0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
2eec0 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
2eed0 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
2eee0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
2eef0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
2ef00 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
2ef10 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
2ef20 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
2ef30 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
2ef40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2ef50 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
2ef60 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2ef70 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
2ef80 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
2ef90 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
2efa0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
2efb0 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
2efc0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
2efd0 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
2efe0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
2eff0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
2f000 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
2f010 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
2f020 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
2f030 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
2f040 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
2f050 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
2f060 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
2f070 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
2f080 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
2f090 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
2f0a0 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
2f0b0 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
2f0c0 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
2f0d0 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
2f0e0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
2f0f0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
2f100 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
2f110 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
2f120 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
2f130 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
2f140 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
2f150 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
2f160 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
2f170 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
2f180 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
2f190 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
2f1a0 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
2f1b0 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
2f1c0 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
2f1d0 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
2f1e0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
2f1f0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
2f200 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
2f210 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
2f220 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
2f230 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
2f240 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
2f250 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
2f260 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
2f270 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
2f280 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
2f290 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
2f2a0 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
2f2b0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
2f2c0 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
2f2d0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
2f2e0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
2f2f0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
2f300 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
2f310 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
2f320 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
2f330 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
2f340 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
2f350 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
2f360 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69  (explicity calli
2f370 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  ng the SQLITE_SE
2f380 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
2f390 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
2f3a0 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
2f3b0 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
2f3c0 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
2f3d0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2f3e0 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
2f3f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2f400 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
2f410 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
2f420 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2f430 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2f440 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2f450 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
2f460 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2f470 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
2f480 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
2f490 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
2f4a0 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
2f4b0 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
2f4c0 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
2f4d0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
2f4e0 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
2f4f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
2f500 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
2f510 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
2f520 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
2f530 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2f540 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
2f550 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
2f560 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
2f570 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
2f580 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
2f590 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
2f5a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
2f5b0 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
2f5c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
2f5d0 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
2f5e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2f5f0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
2f600 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
2f610 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
2f620 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2f630 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
2f640 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
2f650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f660 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
2f670 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
2f680 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76   lockless */.  v
2f690 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
2f6a0 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
2f6b0 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
2f6c0 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
2f6d0 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
2f6e0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2f6f0 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
2f700 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
2f710 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
2f720 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
2f730 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
2f740 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
2f750 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
2f760 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
2f770 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
2f780 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
2f790 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
2f7a0 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
2f7b0 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
2f7c0 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
2f7d0 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
2f7e0 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
2f7f0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
2f800 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
2f810 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
2f820 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
2f830 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
2f840 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
2f850 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
2f860 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
2f870 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
2f880 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
2f890 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
2f8a0 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
2f8b0 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
2f8c0 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
2f8d0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
2f8e0 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
2f8f0 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
2f900 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2f910 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
2f920 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
2f930 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
2f940 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
2f950 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29   errno, getpid()
2f960 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2f970 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2f980 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
2f990 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
2f9a0 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
2f9b0 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
2f9c0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
2f9d0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
2f9e0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
2f9f0 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
2fa00 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
2fa10 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
2fa20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
2fa30 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
2fa40 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
2fa50 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
2fa60 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
2fa70 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
2fa80 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
2fa90 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
2faa0 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
2fab0 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
2fac0 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69  )<(int)maxLen; i
2fad0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
2fae0 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
2faf0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
2fb00 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
2fb10 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
2fb20 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
2fb30 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
2fb40 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
2fb50 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2fb60 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
2fb70 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2fb80 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
2fb90 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
2fba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2fbb0 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
2fbc0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
2fbd0 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
2fbe0 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
2fbf0 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
2fc00 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
2fc10 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2fc20 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
2fc30 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
2fc40 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
2fc50 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
2fc60 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
2fc70 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
2fc80 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
2fc90 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
2fca0 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
2fcb0 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
2fcc0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
2fcd0 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
2fce0 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
2fcf0 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
2fd00 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
2fd10 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
2fd20 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
2fd30 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
2fd40 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
2fd50 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
2fd60 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
2fd70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
2fd80 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
2fd90 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
2fda0 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
2fdb0 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
2fdc0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
2fdd0 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
2fde0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2fdf0 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
2fe00 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
2fe10 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
2fe20 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
2fe30 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
2fe40 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2fe50 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
2fe60 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
2fe70 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
2fe80 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
2fe90 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
2fea0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
2feb0 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
2fec0 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
2fed0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
2fee0 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
2fef0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2ff00 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
2ff30 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
2ff40 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
2ff50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
2ff60 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
2ff70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff80 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
2ff90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
2ffa0 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
2ffb0 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
2ffc0 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
2ffd0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
2ffe0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
2fff0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
30000 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
30010 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
30020 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
30030 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
30040 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
30050 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
30060 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
30070 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
30080 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
30090 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
300a0 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
300b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
300c0 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
300d0 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
300e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
300f0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
30100 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
30110 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
30120 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
30130 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
30140 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
30150 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
30160 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
30170 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
30180 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
30190 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
301a0 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
301b0 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
301c0 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
301d0 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
301e0 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
301f0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
30200 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
30210 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
30220 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
30230 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
30240 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
30250 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30260 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
30270 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
30280 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
30290 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
302a0 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
302b0 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
302c0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
302d0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
302e0 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
302f0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
30300 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
30310 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
30320 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
30330 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
30340 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
30350 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
30360 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
30370 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
30380 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
30390 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
303a0 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
303b0 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
303c0 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
303d0 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
303e0 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
303f0 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
30400 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
30410 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
30420 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
30430 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
30440 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
30450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
30460 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
30470 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
30480 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
30490 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
304a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
304b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
304c0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
304d0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
304e0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
304f0 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45  Flags, SQLITE_DE
30500 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
30510 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72  SSIONS);.    ter
30520 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
30530 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
30540 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
30550 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
30560 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
30570 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
30580 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
30590 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
305a0 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
305b0 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
305c0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
305d0 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
305e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
305f0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
30600 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
30610 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72  ONLY;.    fd = r
30620 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
30630 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49   openFlags, SQLI
30640 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
30650 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
30660 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    terrno = errno
30670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  ;.  }.  if( fd<0
30680 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f   ){.    if( islo
30690 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  ckfile ){.      
306a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
306b0 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  SY;.    }.    sw
306c0 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a  itch (terrno) {.
306d0 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43 45        case EACCE
306e0 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  S:.        retur
306f0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
30700 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a       case EIO: .
30710 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30720 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
30730 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ; /* even though
30740 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68   it is the conch
30750 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c   */.      defaul
30760 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
30770 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
30780 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
30790 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75  }.  .  pNew = (u
307a0 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65  nixFile *)sqlite
307b0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
307c0 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
307d0 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
307e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
307f0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  EM;.    goto end
30800 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20  _create_proxy;. 
30810 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
30820 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
30830 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  File));.  pNew->
30840 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
30850 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28  Flags;.  memset(
30860 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69  &dummyVfs, 0, si
30870 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b  zeof(dummyVfs));
30880 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
30890 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
308a0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
308b0 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d  .  dummyVfs.zNam
308c0 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70  e = "dummy";.  p
308d0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
308e0 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67  .  pUnused->flag
308f0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
30900 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d   pNew->pUnused =
30910 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
30920 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
30930 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
30940 2c 20 30 2c 20 28 73 71 6c 69 74 65 33 5f 66 69  , 0, (sqlite3_fi
30950 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20  le*)pNew, path, 
30960 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
30970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30980 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70  .    *ppFile = p
30990 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  New;.    return 
309a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65  SQLITE_OK;.  }.e
309b0 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a  nd_create_proxy:
309c0 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c      .  robust_cl
309d0 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f  ose(pNew, fd, __
309e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74  LINE__);.  sqlit
309f0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
30a00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
30a10 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
30a20 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
30a30 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
30a40 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
30a50 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
30a60 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
30a70 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
30a80 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
30a90 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
30aa0 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
30ab0 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
30ac0 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
30ad0 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
30ae0 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20  ../* Not always 
30af0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68  defined in the h
30b00 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67  eaders as it oug
30b10 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65  ht to be */.exte
30b20 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75  rn int gethostuu
30b30 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f  id(uuid_t id, co
30b40 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73  nst struct times
30b50 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20  pec *wait);../* 
30b60 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
30b70 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
30b80 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
30b90 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
30ba0 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
30bb0 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
30bc0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
30bd0 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
30be0 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
30bf0 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
30c00 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
30c10 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
30c20 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
30c30 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
30c40 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
30c50 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
30c60 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
30c70 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
30c80 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
30c90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
30ca0 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
30cb0 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
30cc0 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  50.  {.    stati
30cd0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74  c const struct t
30ce0 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
30cf0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
30d00 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
30d10 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
30d20 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
30d30 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
30d40 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
30d50 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
30d60 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
30d70 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
30d80 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
30d90 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
30da0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
30db0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30dc0 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
30dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
30de0 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
30df0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
30e00 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
30e10 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
30e20 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
30e30 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
30e40 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
30e50 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
30e60 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
30e70 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
30e80 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
30e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
30ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30eb0 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
30ec0 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
30ed0 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
30ee0 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
30ef0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
30f00 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
30f10 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
30f20 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
30f30 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
30f40 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
30f50 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
30f60 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
30f70 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
30f80 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
30f90 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
30fa0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
30fb0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
30fc0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
30fd0 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
30fe0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
30ff0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
31000 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
31010 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
31020 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
31030 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
31040 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
31050 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
31060 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
31070 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
31080 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
31090 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
310a0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
310b0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
310c0 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
310d0 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
310e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
310f0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74  .** closed.  Ret
31100 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63  urns zero if suc
31110 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74  cessful..*/.stat
31120 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61  ic int proxyBrea
31130 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  kConchLock(unixF
31140 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
31150 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20  _t myHostID){.  
31160 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31170 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
31180 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
31190 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
311a0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
311b0 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
311c0 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
311d0 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68  le;.  char tPath
311e0 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20  [MAXPATHLEN];.  
311f0 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d  char buf[PROXY_M
31200 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63  AXCONCHLEN];.  c
31210 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74  har *cPath = pCt
31220 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
31230 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c  ;.  size_t readL
31240 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74  en = 0;.  size_t
31250 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20   pathLen = 0;.  
31260 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20  char errmsg[64] 
31270 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d  = "";.  int fd =
31280 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   -1;.  int rc = 
31290 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  -1;.  UNUSED_PAR
312a0 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29  AMETER(myHostID)
312b0 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
312c0 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
312d0 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
312e0 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
312f0 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
31300 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
31310 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
31320 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
31330 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
31340 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
31350 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
31360 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
31370 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
31380 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
31390 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
313a0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
313b0 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f  rrmsg,"path erro
313c0 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
313d0 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67  )pathLen);.    g
313e0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
313f0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64  k;.  }.  /* read
31400 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65   the conch conte
31410 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20  nt */.  readLen 
31420 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46  = osPread(conchF
31430 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f  ile->h, buf, PRO
31440 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
31450 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65  0);.  if( readLe
31460 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  n<PROXY_PATHINDE
31470 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  X ){.    sqlite3
31480 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31490 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
314a0 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e  "read error (len
314b0 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c   %d)",(int)readL
314c0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
314d0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
314e0 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f  .  /* write it o
314f0 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ut to the tempor
31500 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a  ary break file *
31510 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  /.  fd = robust_
31520 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52  open(tPath, (O_R
31530 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58  DWR|O_CREAT|O_EX
31540 43 4c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CL),.           
31550 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
31560 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
31570 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
31580 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
31590 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
315a0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
315b0 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
315c0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
315d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
315e0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
315f0 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64   if( osPwrite(fd
31600 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
31610 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72  0) != (ssize_t)r
31620 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71  eadLen ){.    sq
31630 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
31640 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
31650 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
31660 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
31670 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
31680 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
31690 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
316a0 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
316b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
316c0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
316d0 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  ), errmsg, "rena
316e0 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
316f0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
31700 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
31710 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
31720 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
31730 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
31740 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
31750 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c  th);.  robust_cl
31760 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68  ose(pFile, conch
31770 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
31780 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  _);.  conchFile-
31790 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
317a0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
317b0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
317c0 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
317d0 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
317e0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
317f0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
31800 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
31810 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
31820 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
31830 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
31840 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
31850 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
31860 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
31870 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
31880 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
31890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
318a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
318b0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
318c0 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
318d0 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
318e0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
318f0 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
31900 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
31910 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
31920 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
31930 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
31940 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
31950 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
31960 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
31970 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
31980 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
31990 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
319a0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
319b0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
319c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
319d0 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
319e0 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
319f0 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
31a00 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  ime;.  .  memset
31a10 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20  (&conchModTime, 
31a20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d  0, sizeof(conchM
31a30 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b  odTime));.  do {
31a40 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
31a50 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
31a60 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
31a70 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
31a80 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
31a90 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
31aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
31ab0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
31ac0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
31ad0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
31ae0 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
31af0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
31b00 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
31b10 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
31b20 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
31b30 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
31b40 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
31b50 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
31b60 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
31b70 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
31b80 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
31b90 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
31ba0 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
31bb0 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
31bc0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
31bd0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
31be0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
31bf0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
31c00 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
31c10 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
31c20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
31c30 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
31c40 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
31c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
31c60 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
31c70 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
31c80 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
31c90 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
31ca0 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
31cb0 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
31cc0 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
31cd0 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
31ce0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
31cf0 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
31d00 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
31d10 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31d20 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
31d30 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
31d40 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
31d50 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
31d60 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
31d70 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
31d80 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
31d90 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
31da0 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
31db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
31dc0 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
31dd0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
31de0 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
31df0 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
31e00 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
31e10 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
31e20 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
31e30 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
31e40 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
31e50 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
31e60 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
31e70 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
31e80 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
31e90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31ea0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
31eb0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
31ec0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
31ed0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
31ee0 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
31ef0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
31f00 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
31f10 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
31f20 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
31f30 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
31f40 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
31f50 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
31f60 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
31f70 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
31f80 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
31f90 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
31fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31fb0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
31fc0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
31fd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
31fe0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
31ff0 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
32000 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
32010 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
32020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32030 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
32040 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
32050 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
32060 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
32070 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
32080 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
32090 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
320a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
320b0 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
320c0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
320d0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
320e0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
320f0 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
32100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32110 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
32120 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
32130 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
32140 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
32150 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
32160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
32170 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
32180 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
32190 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
321a0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
321b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
321c0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
321d0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
321e0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
321f0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
32200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32210 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
32220 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
32230 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
32240 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
32250 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
32260 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
32270 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
32280 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
32290 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
322a0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
322b0 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
322c0 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
322d0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
322e0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
322f0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
32300 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
32310 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
32320 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
32330 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
32340 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
32350 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
32360 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
32370 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
32380 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
32390 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
323a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
323b0 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
323c0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
323d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
323e0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
323f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
32400 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
32410 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
32420 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
32430 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
32440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
32460 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
32470 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
32480 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
32490 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
324a0 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
324b0 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
324c0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
324d0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
324e0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
324f0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
32500 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
32510 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
32520 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
32530 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
32540 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
32550 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
32560 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
32570 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
32580 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
32590 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
325a0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
325b0 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
325c0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
325d0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
325e0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
325f0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
32600 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
32610 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32620 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
32630 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
32640 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
32650 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
32660 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
32670 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
32680 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
32690 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
326a0 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
326b0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
326c0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
326d0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
326e0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
326f0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
32700 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32720 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
32730 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
32740 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
32750 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
32760 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
32770 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
32780 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
32790 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
327a0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
327b0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
327c0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
327d0 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
327e0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
327f0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
32800 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
32810 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
32820 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
32830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
32840 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
32850 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
32860 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
32870 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
32880 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
32890 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
328b0 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
328c0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
328d0 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
328e0 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
328f0 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
32900 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
32910 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
32920 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
32930 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
32940 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
32950 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
32960 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
32970 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
32980 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
32990 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
329a0 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
329b0 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
329c0 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
329d0 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
329e0 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
329f0 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
32a00 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
32a10 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
32a20 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
32a30 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
32a40 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
32a50 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
32a60 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
32a70 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
32a80 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
32a90 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
32aa0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
32ab0 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
32ac0 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
32ad0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
32ae0 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b00 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
32b10 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
32b20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
32b30 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
32b40 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
32b50 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
32b60 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
32b70 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
32b80 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
32b90 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
32ba0 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
32bb0 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
32bc0 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
32bd0 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
32be0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
32bf0 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
32c00 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
32c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32c20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
32c30 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
32c40 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
32c50 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
32c60 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
32c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
32c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
32c90 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
32ca0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
32cb0 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
32cc0 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
32cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32ce0 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
32cf0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
32d00 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
32d10 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
32d20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
32d30 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
32d40 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
32d50 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
32d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
32d70 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
32d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
32d90 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32da0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
32db0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
32dc0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
32dd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
32de0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
32df0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32e00 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
32e10 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
32e20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
32e30 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32e40 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
32e50 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e70 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
32e80 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
32e90 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
32ea0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
32eb0 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
32ec0 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
32ed0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
32ee0 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
32ef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32f00 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
32f10 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
32f20 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
32f30 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
32f40 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
32f50 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
32f60 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
32f70 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
32f80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32f90 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
32fa0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
32fb0 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
32fc0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
32fd0 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
32fe0 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
32ff0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
33000 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
33010 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
33020 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
33030 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
33040 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
33050 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
33060 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
33070 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
33080 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
33090 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
330a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
330b0 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
330c0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
330d0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
330e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
330f0 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
33100 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
33110 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
33120 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
33130 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
33140 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
33150 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
33160 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
33170 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
33180 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
33190 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
331a0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
331b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
331c0 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
331d0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
331e0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
331f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
33200 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
33210 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
33220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
33230 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
33240 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
33250 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
33260 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
33270 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
33280 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
33290 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
332a0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
332b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
332c0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
332d0 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
332e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
332f0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
33300 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
33310 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
33320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33340 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
33350 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
33360 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33370 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
33380 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
33390 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
333a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
333b0 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
333c0 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
333d0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
333e0 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
333f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
33400 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
33410 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
33420 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
33430 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
33440 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
33450 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
33460 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
33470 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
33480 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
33490 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
334a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
334b0 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
334c0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
334d0 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
334e0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
334f0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
33500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33510 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
33520 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
33530 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
33540 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
33550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33560 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
33570 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
33580 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
33590 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
335a0 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
335b0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
335c0 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
335d0 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
335e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
335f0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
33600 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
33610 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
33620 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
33630 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
33640 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
33650 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
33660 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
33670 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
33680 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
33690 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
336a0 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
336b0 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
336c0 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
336d0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
336e0 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
336f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
33700 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
33710 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
33720 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
33730 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
33740 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
33750 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
33760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
33770 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
33780 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
33790 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
337a0 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
337b0 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
337c0 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
337f0 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
33800 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
33810 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
33820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
33830 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
33840 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
33850 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
33860 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
33870 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
33880 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
33890 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
338a0 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
338b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
338c0 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
338d0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
338e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
338f0 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
33900 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
33910 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33920 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
33930 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
33940 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
33950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33960 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
33970 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
33980 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
339a0 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
339b0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
339c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
339d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
339e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
339f0 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
33a00 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
33a10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33a30 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
33a40 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
33a50 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
33a60 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
33a70 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
33a80 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
33a90 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
33aa0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
33ab0 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
33ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33ad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33ae0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
33af0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
33b00 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
33b10 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
33b20 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
33b30 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
33b40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
33b50 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
33b60 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
33b70 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
33b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33b90 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
33ba0 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  gs ){.        in
33bb0 74 20 66 64 3b 0a 20 20 20 20 20 20 20 20 69 66  t fd;.        if
33bc0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
33bd0 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
33be0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
33bf0 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
33c00 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
33c10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
33c20 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20   -1;.        fd 
33c30 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43  = robust_open(pC
33c40 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
33c50 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  e->openFlags,.  
33c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c70 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
33c80 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
33c90 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  ONS);.        OS
33ca0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
33cb0 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c 6e 22 2c  XY: OPEN  %d\n",
33cc0 20 66 64 29 29 3b 0a 20 20 20 20 20 20 20 20 69   fd));.        i
33cd0 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
33ce0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
33cf0 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   fd;.        }el
33d00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
33d10 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
33d20 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49 54 45  _BKPT; /* SQLITE
33d30 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61 6b 65  _BUSY? proxyTake
33d40 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20 20 20  Conch called.   
33d50 20 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 6c          during l
33d60 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ocking */.      
33d70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33d90 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e 6c 6f  _OK && !pCtx->lo
33da0 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  ckProxy ){.     
33db0 20 20 20 63 68 61 72 20 2a 70 61 74 68 20 3d 20     char *path = 
33dc0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f 20 74  tempLockPath ? t
33dd0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20 70 43  empLockPath : pC
33de0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
33df0 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  h;.        rc = 
33e00 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
33e10 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74 78 2d  ile(path, &pCtx-
33e20 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29 3b 0a  >lockProxy, 1);.
33e30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33e40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
33e50 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
33e60 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
33e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
33e80 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72 65 61  we couldn't crea
33e90 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  te the proxy loc
33ea0 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  k file with the 
33eb0 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  old lock file pa
33ec0 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  th.           **
33ed0 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20 76 69   so try again vi
33ee0 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20  a auto-naming . 
33ef0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
33f00 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65 77 4c         forceNewL
33f10 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20  ockPath = 1;.   
33f20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63         tryOldLoc
33f30 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  kPath = 0;.     
33f40 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
33f50 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74 68 65  * go back to the
33f60 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73 74 61   do {} while sta
33f70 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20 61 67  rt point, try ag
33f80 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ain */.        }
33f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33fa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
33fc0 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f  eed to make a co
33fd0 70 79 20 6f 66 20 70 61 74 68 20 69 66 20 77 65  py of path if we
33fe0 20 65 78 74 72 61 63 74 65 64 20 74 68 65 20 76   extracted the v
33ff0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 2a 2a  alue.         **
34000 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63 68 20   from the conch 
34010 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61 74 68  file or the path
34020 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f   was allocated o
34030 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20 20 20  n the stack.    
34040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34050 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  if( tempLockPath
34060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
34070 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
34080 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  h = sqlite3DbStr
34090 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63 6b 50  Dup(0, tempLockP
340a0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ath);.          
340b0 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
340c0 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
340d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
340e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
340f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78   ){.        pCtx
34130 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 31 3b  ->conchHeld = 1;
34140 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
34150 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b    if( pCtx->lock
34160 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 20 3d  Proxy->pMethod =
34170 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
34180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  ){.          afp
34190 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
341a0 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20 20 20  afpCtx;.        
341b0 20 20 61 66 70 43 74 78 20 3d 20 28 61 66 70 4c    afpCtx = (afpL
341c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
341d0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
341e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
341f0 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
34200 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43 74 78  x->dbPath = pCtx
34210 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
34220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34230 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
34240 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
34250 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
34260 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
34270 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29  chFile, NO_LOCK)
34280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34290 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
342a0 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63  NCH  %d %s\n", c
342b0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
342c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d              rc==
342d0 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22  SQLITE_OK?"ok":"
342e0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
342f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34300 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f 2a 20  } while (1); /* 
34310 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
34320 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a 61 75  to retry the :au
34330 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20  to: lock file - 
34340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34350 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 6e    ** we should n
34360 65 76 65 72 20 67 65 74 20 68 65 72 65 20 65 78  ever get here ex
34370 63 65 70 74 20 76 69 61 20 74 68 65 20 27 63 6f  cept via the 'co
34380 6e 74 69 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f  ntinue' call. */
34390 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
343a0 20 70 46 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c   pFile holds a l
343b0 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66  ock on a conch f
343c0 69 6c 65 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ile, then releas
343d0 65 20 74 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e that lock..*/.
343e0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
343f0 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 75 6e 69  ReleaseConch(uni
34400 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
34410 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34420 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
34430 53 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  Subroutine retur
34440 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78  n code */.  prox
34450 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34460 2a 70 43 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c  *pCtx;  /* The l
34470 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  ocking context f
34480 6f 72 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  or the proxy loc
34490 6b 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  k */.  unixFile 
344a0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
344b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
344c0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
344d0 0a 20 20 70 43 74 78 20 3d 20 28 70 72 6f 78 79  .  pCtx = (proxy
344e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
344f0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34500 6f 6e 74 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46  ontext;.  conchF
34510 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
34520 68 46 69 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45  hFile;.  OSTRACE
34530 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20  (("RELEASECONCH 
34540 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
34550 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
34560 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
34570 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
34580 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
34590 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
345a0 74 6f 3a 22 29 2c 20 0a 20 20 20 20 20 20 20 20  to:"), .        
345b0 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20     getpid()));. 
345c0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
345d0 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 72 63  Held>0 ){.    rc
345e0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
345f0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
34600 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
34610 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b  nchFile, NO_LOCK
34620 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 63  );.  }.  pCtx->c
34630 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
34640 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53  OSTRACE(("RELEAS
34650 45 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22  ECONCH  %d %s\n"
34660 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
34670 20 20 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d             (rc==
34680 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
34690 20 3a 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a   : "failed")));.
346a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
346b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
346c0 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
346d0 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75 74 65  se file, compute
346e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69 74 73   the name of its
346f0 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2a 20   conch file..** 
34700 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63 68 20  Store the conch 
34710 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f  filename in memo
34720 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
34730 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
34740 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e  )..** Make *pCon
34750 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74 6f 20  chPath point to 
34760 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20 20 52  the new name.  R
34770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
34780 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
34790 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
347a0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74 61 69   unable to obtai
347b0 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  n memory..**.** 
347c0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
347d0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
347e0 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
347f0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
34800 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65 76 65  .** space is eve
34810 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  ntually freed..*
34820 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61 74 68  *.** *pConchPath
34830 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
34840 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
34850 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
34860 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
34870 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f  nt proxyCreateCo
34880 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68 61 72  nchPathname(char
34890 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
348a0 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a 20 20  *pConchPath){.  
348b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
348c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
348d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
348e0 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 69 6e  .  int len = (in
348f0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
34900 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 64  ; /* Length of d
34910 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
34920 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20 20 63   - dbPath */.  c
34930 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68 3b 20  har *conchPath; 
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34950 62 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  buffer in which 
34960 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63 6f 6e  to construct con
34970 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a  ch name */..  /*
34980 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
34990 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
349a0 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69 74 69  lename and initi
349b0 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 20 74  alize the name t
349c0 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  o.  ** the name 
349d0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
349e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
349f0 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50 61 74  /  .  *pConchPat
34a00 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20 3d 20  h = conchPath = 
34a10 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
34a20 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38 29 3b  malloc(len + 8);
34a30 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68  .  if( conchPath
34a40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
34a50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
34a60 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63 6f 6e    }.  memcpy(con
34a70 63 68 50 61 74 68 2c 20 64 62 50 61 74 68 2c 20  chPath, dbPath, 
34a80 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f 2a 20  len+1);.  .  /* 
34a90 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22 2e 22  now insert a "."
34aa0 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74   before the last
34ab0 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a   / character */.
34ac0 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d 31 29    for( i=(len-1)
34ad0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20  ; i>=0; i-- ){. 
34ae0 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61 74 68     if( conchPath
34af0 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
34b00 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65    i++;.      bre
34b10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
34b20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27 2e 27  conchPath[i]='.'
34b30 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c 6c 65  ;.  while ( i<le
34b40 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68 50 61  n ){.    conchPa
34b50 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68 5b 69  th[i+1]=dbPath[i
34b60 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  ];.    i++;.  }.
34b70 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74 68 65  .  /* append the
34b80 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66 69 78   "-conch" suffix
34b90 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
34ba0 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63 68 50    memcpy(&conchP
34bb0 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63  ath[i+1], "-conc
34bc0 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65 72 74  h", 7);.  assert
34bd0 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 63 6f  ( (int)strlen(co
34be0 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65 6e 2b  nchPath) == len+
34bf0 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  7 );..  return S
34c00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
34c10 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79 20 63   Takes a fully c
34c20 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78 79 20  onfigured proxy 
34c30 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 75 6e  locking-style un
34c40 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77 69 74  ix file and swit
34c50 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f 63 61  ches.** the loca
34c60 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  l lock file path
34c70 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
34c80 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79 50  switchLockProxyP
34c90 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ath(unixFile *pF
34ca0 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
34cb0 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
34cc0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34cd0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
34ce0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
34cf0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34d00 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c 64 50  xt;.  char *oldP
34d10 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
34d20 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69 6e 74  ProxyPath;.  int
34d30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34d40 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ..  if( pFile->e
34d50 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
34d60 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
34d70 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
34d80 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e 67    ..  /* nothing
34d90 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70 61   to do if the pa
34da0 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75 74  th is NULL, :aut
34db0 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74 68  o: or matches th
34dc0 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  e existing path 
34dd0 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20 7c  */.  if( !path |
34de0 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27 20  | path[0]=='\0' 
34df0 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68 2c  || !strcmp(path,
34e00 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20 20   ":auto:") ||.  
34e10 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21 73    (oldPath && !s
34e20 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c 20  trncmp(oldPath, 
34e30 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  path, MAXPATHLEN
34e40 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
34e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
34e60 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
34e70 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70  e *lockProxy = p
34e80 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
34e90 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
34ea0 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70 43  oxy=NULL;.    pC
34eb0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
34ec0 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  0;.    if( lockP
34ed0 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  roxy!=NULL ){.  
34ee0 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78 79      rc=lockProxy
34ef0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
34f00 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
34f10 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  *)lockProxy);.  
34f20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
34f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71  urn rc;.      sq
34f40 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50  lite3_free(lockP
34f50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  roxy);.    }.   
34f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f 6c   sqlite3_free(ol
34f70 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74 78  dPath);.    pCtx
34f80 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
34f90 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
34fa0 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d 0a  p(0, path);.  }.
34fb0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
34fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20 69  }../*.** pFile i
34fd0 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  s a file that ha
34fe0 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  s been opened by
34ff0 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20 63   a prior xOpen c
35000 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a 20  all.  dbPath.** 
35010 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  is a string buff
35020 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58 50  er at least MAXP
35030 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63 74  ATHLEN+1 charact
35040 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  ers in size..**.
35050 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35060 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61 6d  find the filenam
35070 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
35080 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69 74  h pFile and writ
35090 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62 50  es it.** int dbP
350a0 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
350b0 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  nt proxyGetDbPat
350c0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e 69  hForUnixFile(uni
350d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 68  xFile *pFile, ch
350e0 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69 66  ar *dbPath){.#if
350f0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
35100 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  __).  if( pFile-
35110 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
35120 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
35130 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b 65   /* afp style ke
35140 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  eps a reference 
35150 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20 69  to the db path i
35160 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20 66  n the filePath f
35170 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ield .    ** of 
35180 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  the struct */.  
35190 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
351a0 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69  trlen((char*)pFi
351b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
351c0 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20  xt)<=MAXPATHLEN 
351d0 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64  );.    strlcpy(d
351e0 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63 6b  bPath, ((afpLock
351f0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
35200 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
35210 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41 58  xt)->dbPath, MAX
35220 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c  PATHLEN);.  } el
35230 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  se.#endif.  if( 
35240 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
35250 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
35260 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f  ods ){.    /* do
35270 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73 65  t lock style use
35280 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
35290 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74  ntext to store t
352a0 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20 20  he dot lock.    
352b0 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  ** file path */.
352c0 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
352d0 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46 69  rlen((char *)pFi
352e0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
352f0 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f 54  xt) - strlen(DOT
35300 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20 20  LOCK_SUFFIX);.  
35310 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68 2c    memcpy(dbPath,
35320 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
35330 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
35340 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c 73  len + 1);.  }els
35350 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74  e{.    /* all ot
35360 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20 74  her styles use t
35370 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
35380 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  xt to store the 
35390 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  db file path */.
353a0 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
353b0 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d  en((char*)pFile-
353c0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
353d0 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a  <=MAXPATHLEN );.
353e0 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61      strlcpy(dbPa
353f0 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c  th, (char *)pFil
35400 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
35410 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  t, MAXPATHLEN);.
35420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
35430 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35440 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61 64   Takes an alread
35450 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69 78  y filled in unix
35460 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72 73   file and alters
35470 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65 20   it so all file 
35480 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c  locking .** will
35490 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
354a0 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78 79   the local proxy
354b0 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68 65   lock file.  The
354c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
354d0 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72 76  s.** are preserv
354e0 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  ed in the lockin
354f0 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68 61  g context so tha
35500 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
35510 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20 74  stored and .** t
35520 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75 72  he unix structur
35530 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61 6e  e properly clean
35540 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20 74  ed up at close t
35550 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69  ime:.**  ->locki
35560 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e  ngContext.**  ->
35570 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74 69  pMethod.*/.stati
35580 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
35590 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
355a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f  xFile *pFile, co
355b0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20  nst char *path) 
355c0 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  {.  proxyLocking
355d0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
355e0 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41 58   char dbPath[MAX
355f0 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20 20  PATHLEN+1];     
35600 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35620 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  /.  char *lockPa
35630 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20 72  th=NULL;.  int r
35640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
35650 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65   .  if( pFile->e
35660 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
35670 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
35680 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
35690 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  .  proxyGetDbPat
356a0 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69  hForUnixFile(pFi
356b0 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69  le, dbPath);.  i
356c0 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
356d0 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
356e0 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
356f0 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  o:") ){.    lock
35700 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  Path=NULL;.  }el
35710 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68  se{.    lockPath
35720 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20  =(char *)path;. 
35730 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28   }.  .  OSTRACE(
35740 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
35750 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
35760 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
35770 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74          (lockPat
35780 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22  h ? lockPath : "
35790 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
357a0 28 29 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20  ()));..  pCtx = 
357b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
357c0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
357d0 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
357e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
357f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
35800 20 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c   memset(pCtx, 0,
35810 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b   sizeof(*pCtx));
35820 0a 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72  ..  rc = proxyCr
35830 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d  eateConchPathnam
35840 65 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d  e(dbPath, &pCtx-
35850 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b  >conchFilePath);
35860 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
35870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
35880 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
35890 46 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68  File(pCtx->conch
358a0 46 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d  FilePath, &pCtx-
358b0 3e 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a  >conchFile, 0);.
358c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
358d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28  TE_CANTOPEN && (
358e0 28 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  (pFile->openFlag
358f0 73 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20  s&O_RDWR) == 0) 
35900 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28  ){.      /* if (
35910 61 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67  a) the open flag
35920 73 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52  s are not O_RDWR
35930 2c 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20  , (b) the conch 
35940 69 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64  isn't there, and
35950 0a 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68  .      ** (c) th
35960 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73  e file system is
35970 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e   read-only, then
35980 20 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69   enable no-locki
35990 6e 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20  ng access..     
359a0 20 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f   ** Ugh, since O
359b0 5f 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20  _RDONLY==0x0000 
359c0 77 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52  we test for !O_R
359d0 44 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70  DWR since unixOp
359e0 65 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20 20  en asserts.     
359f0 20 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61   ** that openFla
35a00 67 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c  gs will have onl
35a10 79 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c  y one of O_RDONL
35a20 59 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20  Y or O_RDWR..   
35a30 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
35a40 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
35a50 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  ;.      struct s
35a60 74 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20  tat conchInfo;. 
35a70 20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c       int goLockl
35a80 65 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ess = 0;..      
35a90 69 66 28 20 6f 73 53 74 61 74 28 70 43 74 78 2d  if( osStat(pCtx-
35aa0 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c 20  >conchFilePath, 
35ab0 26 63 6f 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d  &conchInfo) == -
35ac0 31 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  1 ) {.        in
35ad0 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
35ae0 20 20 20 20 20 20 20 69 66 28 20 28 65 72 72 3d         if( (err=
35af0 3d 45 4e 4f 45 4e 54 29 20 26 26 20 28 73 74 61  =ENOENT) && (sta
35b00 74 66 73 28 64 62 50 61 74 68 2c 20 26 66 73 49  tfs(dbPath, &fsI
35b10 6e 66 6f 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20  nfo) != -1) ){. 
35b20 20 20 20 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c           goLockl
35b30 65 73 73 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f  ess = (fsInfo.f_
35b40 66 6c 61 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59  flags&MNT_RDONLY
35b50 29 20 3d 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b  ) == MNT_RDONLY;
35b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35b70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6f 4c   }.      if( goL
35b80 6f 63 6b 6c 65 73 73 20 29 7b 0a 20 20 20 20 20  ockless ){.     
35b90 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
35ba0 6c 64 20 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64  ld = -1; /* read
35bb0 20 6f 6e 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65   only FS/ lockle
35bc0 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ss */.        rc
35bd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35be0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
35bf0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
35c00 54 45 5f 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74  TE_OK && lockPat
35c10 68 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c  h ){.    pCtx->l
35c20 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
35c30 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
35c40 2c 20 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d  , lockPath);.  }
35c50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
35c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74  TE_OK ){.    pCt
35c70 78 2d 3e 64 62 50 61 74 68 20 3d 20 73 71 6c 69  x->dbPath = sqli
35c80 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 64  te3DbStrDup(0, d
35c90 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  bPath);.    if( 
35ca0 70 43 74 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55  pCtx->dbPath==NU
35cb0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  LL ){.      rc =
35cc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
35cd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
35ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35cf0 20 20 20 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72      /* all memor
35d00 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  y is allocated, 
35d10 70 72 6f 78 79 73 20 61 72 65 20 63 72 65 61 74  proxys are creat
35d20 65 64 20 61 6e 64 20 61 73 73 69 67 6e 65 64 2c  ed and assigned,
35d30 20 0a 20 20 20 20 2a 2a 20 73 77 69 74 63 68 20   .    ** switch 
35d40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
35d50 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20  ext and pMethod 
35d60 74 68 65 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20  then return..   
35d70 20 2a 2f 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c   */.    pCtx->ol
35d80 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  dLockingContext 
35d90 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  = pFile->locking
35da0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69  Context;.    pFi
35db0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
35dc0 78 74 20 3d 20 70 43 74 78 3b 0a 20 20 20 20 70  xt = pCtx;.    p
35dd0 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20  Ctx->pOldMethod 
35de0 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
35df0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ;.    pFile->pMe
35e00 74 68 6f 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d  thod = &proxyIoM
35e10 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
35e20 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63  .    if( pCtx->c
35e30 6f 6e 63 68 46 69 6c 65 20 29 7b 20 0a 20 20 20  onchFile ){ .   
35e40 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69     pCtx->conchFi
35e50 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
35e60 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
35e70 65 20 2a 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e *)pCtx->conchF
35e80 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
35e90 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63  te3_free(pCtx->c
35ea0 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d  onchFile);.    }
35eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
35ec0 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  ee(0, pCtx->lock
35ed0 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  ProxyPath);.    
35ee0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
35ef0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
35f00 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ); .    sqlite3_
35f10 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 7d 0a  free(pCtx);.  }.
35f20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e    OSTRACE(("TRAN
35f30 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c 6e 22  SPROXY  %d %s\n"
35f40 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
35f50 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
35f60 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
35f70 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65  failed")));.  re
35f80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
35f90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35fa0 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33 5f  handles sqlite3_
35fb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 63  file_control() c
35fc0 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73 70  alls that are sp
35fd0 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72 6f  ecific.** to pro
35fe0 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  xy locking..*/.s
35ff0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
36000 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
36010 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
36020 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
36030 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  {.  switch( op )
36040 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
36050 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
36060 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ILE: {.      uni
36070 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
36080 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
36090 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
360a0 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79  Method == &proxy
360b0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
360c0 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
360d0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
360e0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
360f0 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
36100 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
36110 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65 43        proxyTakeC
36120 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 20  onch(pFile);.   
36130 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c       if( pCtx->l
36140 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
36150 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
36160 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
36170 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
36180 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 65  Path;.        }e
36190 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
361a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70  (const char **)p
361b0 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28 6e  Arg = ":auto: (n
361c0 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20 20  ot held)";.     
361d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
361e0 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 6f  e {.        *(co
361f0 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
36200 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d   = NULL;.      }
36210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
36220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
36230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
36240 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
36250 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69  : {.      unixFi
36260 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
36270 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20  xFile*)id;.     
36280 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36290 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  _OK;.      int i
362a0 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28 70  sProxyStyle = (p
362b0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
362c0 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
362d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
362e0 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e 73  g==NULL || (cons
362f0 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d 30  t char *)pArg==0
36300 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
36310 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a  isProxyStyle ){.
36320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72            /* tur
36330 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b  n off proxy lock
36340 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f 72  ing - not suppor
36350 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
36360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
36370 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f 54  OR /*SQLITE_PROT
36380 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49 53  OCOL? SQLITE_MIS
36390 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20 20  USE?*/;.        
363a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
363b0 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
363c0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c 72  xy locking - alr
363d0 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50 20  eady off - NOOP 
363e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
363f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
36400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36410 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
36420 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61 74  t char *proxyPat
36430 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  h = (const char 
36440 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
36450 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65  if( isProxyStyle
36460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
36470 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
36480 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20 20  t *pCtx = .     
36490 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f 63         (proxyLoc
364a0 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46 69  kingContext*)pFi
364b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
364c0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  xt;.          if
364d0 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c 20  ( !strcmp(pArg, 
364e0 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20 20  ":auto:") .     
364f0 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d 3e        || (pCtx->
36500 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26 26  lockProxyPath &&
36510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36520 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
36530 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70 72  ockProxyPath, pr
36540 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48  oxyPath, MAXPATH
36550 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20 20  LEN)).          
36560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
36570 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36580 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
36590 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
365a0 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78 79   switchLockProxy
365b0 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f 78  Path(pFile, prox
365c0 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
365d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
365e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
365f0 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66 69  turn on proxy fi
36600 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  le locking */.  
36610 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
36620 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
36630 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78 79  ile(pFile, proxy
36640 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d  Path);.        }
36650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
36660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36670 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
36680 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
36690 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20 61  ;  /* The call a
366a0 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c 79  ssures that only
366b0 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20 61   valid opcodes a
366c0 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20 7d  re sent */.    }
366d0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
366e0 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  HED*/.  return S
366f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
36700 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  /*.** Within thi
36710 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65 20  s division (the 
36720 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
36730 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
36740 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73 0a   the procedures.
36750 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70 6f  ** above this po
36760 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69 6c  int are all util
36770 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63 6b  ities.  The lock
36780 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64 73  -related methods
36790 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   of the.** proxy
367a0 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
367b0 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65 63  _io_method objec
367c0 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f  t follow..*/.../
367d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
367e0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
367f0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
36800 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
36810 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
36820 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
36830 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
36840 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
36850 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
36860 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
36870 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
36880 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
36890 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
368a0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
368b0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
368c0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
368d0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
368e0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
368f0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
36900 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
36910 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
36920 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
36930 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
36940 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
36950 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
36960 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
36970 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
36980 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
36990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
369a0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
369b0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
369c0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
369d0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
369e0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69  ngContext;.    i
369f0 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
36a00 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ld>0 ){.      un
36a10 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
36a20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
36a30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
36a40 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
36a50 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
36a60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36a70 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29 3b  proxy, pResOut);
36a80 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20 63  .    }else{ /* c
36a90 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
36aa0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
36ab0 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20 20    pResOut=0;.   
36ac0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
36ad0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
36ae0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
36af0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
36b00 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
36b10 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
36b20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
36b30 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
36b40 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
36b50 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
36b60 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
36b70 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
36b80 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
36b90 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
36ba0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
36bb0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
36bc0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
36bd0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
36be0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
36bf0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
36c00 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
36c10 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
36c20 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
36c30 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
36c40 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
36c50 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
36c60 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
36c70 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
36c80 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
36c90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
36ca0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
36cb0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
36cc0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
36cd0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
36ce0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
36cf0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
36d00 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
36d10 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
36d20 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
36d30 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
36d40 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
36d50 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
36d60 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
36d70 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
36d80 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
36d90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
36da0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
36db0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
36dc0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
36dd0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
36de0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
36df0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
36e00 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
36e10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
36e20 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
36e30 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
36e40 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
36e50 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
36e60 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
36e70 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
36e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36e90 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
36ea0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
36eb0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36ec0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36ed0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36ee0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
36ef0 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
36f00 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
36f10 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
36f20 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  y;.      rc = pr
36f30 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  oxy->pMethod->xL
36f40 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
36f50 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c  e*)proxy, eFileL
36f60 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  ock);.      pFil
36f70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  e->eFileLock = p
36f80 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  roxy->eFileLock;
36f90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36fa0 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c    /* conchHeld <
36fb0 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
36fc0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
36fd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
36fe0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
36ff0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
37000 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
37010 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
37020 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
37030 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
37040 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
37050 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
37060 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
37070 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
37080 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
37090 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
370a0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
370b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
370c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
370d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
370e0 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f  ic int proxyUnlo
370f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
37100 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
37110 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
37120 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
37130 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
37140 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
37150 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
37160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37170 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
37180 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37190 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
371a0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
371b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
371c0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
371d0 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
371e0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
371f0 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
37200 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  roxy;.      rc =
37210 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
37220 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
37230 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65  3_file*)proxy, e
37240 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
37250 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
37260 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65  k = proxy->eFile
37270 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Lock;.    }else{
37280 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48  .      /* conchH
37290 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c  eld < 0 is lockl
372a0 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ess */.    }.  }
372b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
372c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
372d0 69 6c 65 20 74 68 61 74 20 75 73 65 73 20 70 72  ile that uses pr
372e0 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  oxy locks..*/.st
372f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
37300 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
37310 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
37320 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
37330 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
37340 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f  ile*)id;.    pro
37350 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37360 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
37370 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
37380 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
37390 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69 78 46  ntext;.    unixF
373a0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d  ile *lockProxy =
373b0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
373c0 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
373d0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
373e0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
373f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37400 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20 69 66  _OK;.    .    if
37410 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20  ( lockProxy ){. 
37420 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72       rc = lockPr
37430 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  oxy->pMethod->xU
37440 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
37450 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20  ile*)lockProxy, 
37460 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
37470 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
37480 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  rc;.      rc = l
37490 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
374a0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
374b0 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f  e3_file*)lockPro
374c0 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
374d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
374e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
374f0 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
37500 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
37510 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oxy = 0;.    }. 
37520 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65     if( conchFile
37530 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
37540 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b  tx->conchHeld ){
37550 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
37560 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68 28  oxyReleaseConch(
37570 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
37580 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
37590 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
375a0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
375b0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73  ->pMethod->xClos
375c0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
375d0 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  )conchFile);.   
375e0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
375f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  rn rc;.      sql
37600 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63 68 46  ite3_free(conchF
37610 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
37620 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
37630 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
37640 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
37650 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
37660 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20  nchFilePath);.  
37670 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
37680 30 2c 20 70 43 74 78 2d 3e 64 62 50 61 74 68 29  0, pCtx->dbPath)
37690 3b 0a 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65  ;.    /* restore
376a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f   the original lo
376b0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
376c0 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63  d pMethod then c
376d0 6c 6f 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70  lose it */.    p
376e0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
376f0 74 65 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64  text = pCtx->old
37700 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
37710 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
37720 6f 64 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  od = pCtx->pOldM
37730 65 74 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74  ethod;.    sqlit
37740 65 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20  e3_free(pCtx);. 
37750 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
37760 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
37770 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
37780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37790 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ...#endif /* def
377a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
377b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
377c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
377d0 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  /./*.** The prox
377e0 79 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  y locking style 
377f0 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
37800 75 73 65 20 77 69 74 68 20 41 46 50 20 66 69 6c  use with AFP fil
37810 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64  esystems..** And
37820 20 73 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e   since AFP is on
37830 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
37840 4d 61 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78  MacOSX, the prox
37850 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73  y locking is als
37860 6f 0a 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20  o.** restricted 
37870 74 6f 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a  to MacOSX..** .*
37880 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
37890 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
378a0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c   proxy lock impl
378b0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
378c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
378d0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
378e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
378f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37920 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
37930 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
37940 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
37950 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
37960 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
37970 20 61 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65   all VFS impleme
37980 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69  ntations for uni
37990 78 2d 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67  x-like operating
379a0 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68  .** systems.  Th
379b0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20  is routine, and 
379c0 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  the sqlite3_os_e
379d0 6e 64 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  nd() routine tha
379e0 74 20 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68  t follows,.** sh
379f0 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79  ould be the only
37a00 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
37a10 73 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  s file that are 
37a20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68  visible from oth
37a30 65 72 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a  er.** files..**.
37a40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
37a50 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64  is called once d
37a60 75 72 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69  uring SQLite ini
37a70 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20  tialization and 
37a80 62 79 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74  by a.** single t
37a90 68 72 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f  hread.  The memo
37aa0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e  ry allocation an
37ab0 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
37ac0 6d 73 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e  ms have not.** n
37ad0 65 63 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20  ecessarily been 
37ae0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
37af0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
37b00 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20   called, and so 
37b10 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e  they.** should n
37b20 6f 74 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69  ot be used..*/.i
37b30 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
37b40 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20  it(void){ .  /* 
37b50 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
37b60 69 6e 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ing macro define
37b70 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72  s an initializer
37b80 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f   for an sqlite3_
37b90 76 66 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  vfs object..  **
37ba0 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
37bb0 20 56 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54   VFS is NAME.  T
37bc0 68 65 20 70 41 70 70 44 61 74 61 20 69 73 20 61  he pAppData is a
37bd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f   pointer to a po
37be0 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  inter.  ** to th
37bf0 65 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  e "finder" funct
37c00 69 6f 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20  ion.  (pAppData 
37c10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
37c20 61 20 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73  a pointer becaus
37c30 65 0a 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30  e.  ** silly C90
37c40 20 72 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20   rules prohibit 
37c50 61 20 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69  a void* from bei
37c60 6e 67 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e  ng cast to a fun
37c70 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20  ction pointer.  
37c80 2a 2a 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  ** and so we hav
37c90 65 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20  e to go through 
37ca0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
37cb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69   pointer to avoi
37cc0 64 20 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20  d problems.  ** 
37cd0 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77  when compiling w
37ce0 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
37cf0 72 6f 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20  rors on GCC.).  
37d00 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44  **.  ** The FIND
37d10 45 52 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  ER parameter to 
37d20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68  this macro is th
37d30 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f  e name of the po
37d40 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  inter to the.  *
37d50 2a 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  * finder-functio
37d60 6e 2e 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66  n.  The finder-f
37d70 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
37d80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37d90 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f  .  ** sqlite_io_
37da0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74  methods object t
37db0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
37dc0 68 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69  he desired locki
37dd0 6e 67 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  ng.  ** behavior
37de0 73 2e 20 20 53 65 65 20 74 68 65 20 64 69 76 69  s.  See the divi
37df0 73 69 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20  sion above that 
37e00 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d  contains the IOM
37e10 45 54 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72  ETHODS.  ** macr
37e20 6f 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69  o for addition i
37e30 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69  nformation on fi
37e40 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a  nder-functions..
37e50 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66    **.  ** Most f
37e60 69 6e 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65  inders simply re
37e70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
37e80 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65  o a fixed sqlite
37e90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a  3_io_methods.  *
37ea0 2a 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74  * object.  But t
37eb0 68 65 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  he "autolockIoFi
37ec0 6e 64 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20  nder" available 
37ed0 6f 6e 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61  on MacOSX does a
37ee0 20 6c 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72   little.  ** mor
37ef0 65 20 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20  e than that; it 
37f00 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
37f10 65 73 79 73 74 65 6d 20 74 79 70 65 20 74 68 61  esystem type tha
37f20 74 20 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a  t hosts the .  *
37f30 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
37f40 61 6e 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f  and tries to cho
37f50 6f 73 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d  ose an locking m
37f60 65 74 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74  ethod appropriat
37f70 65 20 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20  e for.  ** that 
37f80 66 69 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e  filesystem time.
37f90 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
37fa0 55 4e 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c  UNIXVFS(VFSNAME,
37fb0 20 46 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20   FINDER) {      
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fd0 20 20 5c 0a 20 20 20 20 33 2c 20 20 20 20 20 20    \.    3,      
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37ff0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
38000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38010 5c 0a 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69  \.    sizeof(uni
38020 78 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  xFile),     /* s
38030 7a 4f 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20  zOsFile */      
38040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
38050 20 20 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45      MAX_PATHNAME
38060 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50  ,         /* mxP
38070 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
38080 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
38090 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
380a0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
380b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
380c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
380d0 56 46 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  VFSNAME,        
380e0 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
380f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
38100 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76          \.    (v
38110 6f 69 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20  oid*)&FINDER,   
38120 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
38130 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
38140 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
38150 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
38160 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20    /* xOpen */   
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65      \.    unixDe
38190 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
381a0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20  /* xDelete */   
381b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381c0 20 20 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65    \.    unixAcce
381d0 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
381e0 20 78 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20   xAccess */     
381f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38200 5c 0a 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61  \.    unixFullPa
38210 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
38220 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20  FullPathname */ 
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
38240 20 20 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20      unixDlOpen, 
38250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
38260 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
38270 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
38280 20 20 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20    unixDlError,  
38290 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
382a0 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
382b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
382c0 75 6e 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20  unixDlSym,      
382d0 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
382e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
382f0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
38300 69 78 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  ixDlClose,      
38310 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
38320 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
38330 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
38340 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
38350 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
38360 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
38370 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c      \.    unixSl
38380 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
38390 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20  /* xSleep */    
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383b0 20 20 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72    \.    unixCurr
383c0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
383d0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
383e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383f0 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73  \.    unixGetLas
38400 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
38410 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20  GetLastError */ 
38420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
38430 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54      unixCurrentT
38440 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75  imeInt64, /* xCu
38450 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
38460 2f 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20  /           \.  
38470 20 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43    unixSetSystemC
38480 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
38490 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20  ystemCall */    
384a0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
384b0 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c  unixGetSystemCal
384c0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
384d0 74 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20  temCall */      
384e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
384f0 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  ixNextSystemCall
38500 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
38510 65 6d 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20  emCall */       
38520 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f        \.  }..  /
38530 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75  *.  ** All defau
38540 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69  lt VFSes for uni
38550 78 20 61 72 65