/ Hex Artifact Content
Login

Artifact ef71b9892af48871a448c7f4ca662ecd287e70dd:


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 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  ences */.typedef
1610: 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
1620: 75 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20  unixShm;        
1630: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1640: 74 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  tion shared memo
1650: 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ry */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1670: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20   unixShmNode;   
1680: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1690: 6d 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f  mory instance */
16a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e  unixInodeInfo un
16c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f  ixInodeInfo;   /
16d0: 2a 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74  * An i-node */.t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
16f0: 69 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55  ixUnusedFd UnixU
1700: 6e 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20  nusedFd;     /* 
1710: 41 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  An unused file d
1720: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a  escriptor */../*
1730: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61  .** Sometimes, a
1740: 66 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64  fter a file hand
1750: 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  le is closed by 
1760: 53 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65  SQLite, the file
1770: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63   descriptor.** c
1780: 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  annot be closed 
1790: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20  immediately. In 
17a0: 74 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73  these cases, ins
17b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f  tances of the fo
17c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
17d0: 74 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f  ture are used to
17e0: 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
17f0: 64 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65  descriptor while
1800: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a   waiting for an.
1810: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
1820: 6f 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f  o either close o
1830: 72 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73  r reuse it..*/.s
1840: 74 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64  truct UnixUnused
1850: 46 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  Fd {.  int fd;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1880: 74 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  tor to close */.
1890: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18b0: 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64  lags this file d
18c0: 65 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70  escriptor was op
18d0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55  ened with */.  U
18e0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
18f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
1900: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
1910: 63 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20  criptor on same 
1920: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
1930: 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73  * The unixFile s
1940: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
1950: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
1960: 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f  file specific to
1970: 20 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53   the unix.** VFS
1980: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1990: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
19a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69  uct unixFile uni
19b0: 78 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e  xFile;.struct un
19c0: 69 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74  ixFile {.  sqlit
19d0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
19e0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
19f0: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
1a00: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e  st entry */.  un
1a10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1a20: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
1a30: 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20    /* Info about 
1a40: 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e  locks on this in
1a50: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ode */.  int h; 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
1a90: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  tor */.  int dir
1aa0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
1ad0: 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
1ae0: 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
1af0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b10: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1b20: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1b30: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e  /.  int lastErrn
1b40: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
1b60: 6e 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c  nix errno from l
1b70: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1b80: 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67  .  void *locking
1b90: 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20  Context;        
1ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e         /* Lockin
1bb0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
1bc0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78   state */.  Unix
1bd0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
1be0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1bf0: 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64  /* Pre-allocated
1c00: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f   UnixUnusedFd */
1c10: 0a 20 20 69 6e 74 20 66 69 6c 65 46 6c 61 67 73  .  int fileFlags
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c         /* Miscel
1c40: 6c 61 6e 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  lanous flags */.
1c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1c60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1c70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1c90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1cc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1cd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1ce0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1d10: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1d20: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1d30: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d40: 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e  STYLE.  int open
1d50: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d70: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1d80: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1d90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1da0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1db0: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1dc0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1dd0: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74     /* cached det
1e00: 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73  ails from statfs
1e10: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  () */.#endif.#if
1e20: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e   OS_VXWORKS.  in
1e30: 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20  t isDelete;     
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
1e60: 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
1e70: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1e80: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1e90: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1ea0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1eb0: 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  f.#ifndef NDEBUG
1ec0: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1ed0: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1ee0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1ef0: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1f00: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1f10: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1f20: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
1f30: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
1f40: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
1f50: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
1f60: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
1f70: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
1f80: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
1f90: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
1fa0: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
1fb0: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
1fc0: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
1fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1fe0: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1ff0: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
2000: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
2010: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
2020: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
2030: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
2040: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
2050: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
2060: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
2070: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2080: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2090: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
20a0: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
20b0: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
20c0: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
20d0: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
20e0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
20f0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
2100: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
2110: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
2120: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
2130: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
2140: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2150: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2160: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2170: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2180: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2190: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
21a0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
21b0: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
21c0: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
21d0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
21e0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
21f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
2200: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2210: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 62 69  macros define bi
2220: 74 73 20 69 6e 20 75 6e 69 78 46 69 6c 65 2e 66  ts in unixFile.f
2230: 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  ileFlags.*/.#def
2240: 69 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f 4c 45  ine SQLITE_WHOLE
2250: 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20 20 30  _FILE_LOCKING  0
2260: 78 30 30 30 31 20 20 20 2f 2a 20 55 73 65 20 77  x0001   /* Use w
2270: 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e  hole-file lockin
2280: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  g */../*.** Incl
2290: 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73  ude code that is
22a0: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f   common to all o
22b0: 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23  s_*.c files.*/.#
22c0: 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d  include "os_comm
22d0: 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  on.h"../*.** Def
22e0: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
22f0: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
2300: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
2310: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
2320: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2330: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2340: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
2350: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2360: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
2370: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
2380: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
2390: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
23a0: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
23b0: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
23c0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
23d0: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
23e0: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
23f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  dif../*.** The D
2400: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
2410: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
2420: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
2430: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
2440: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
2450: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
2460: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
2470: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
2480: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
2490: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
24a0: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
24b0: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
24c0: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
24d0: 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20    But it is DOS 
24e0: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
24f0: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
2500: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66   __DJGPP__.# def
2510: 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29  ine fcntl(A,B,C)
2520: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2530: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
2540: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
2550: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
2560: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
2570: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2580: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2590: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
25a0: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
25b0: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
25c0: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
25d0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
25e0: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
25f0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
2600: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
2610: 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
2620: 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
2630: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
2640: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
2650: 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ect the unixInod
2660: 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77  eInfo and.** vxw
2670: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
2680: 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ts used by this 
2690: 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
26a0: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68  ch may be .** sh
26b0: 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
26c0: 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
26d0: 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74  Function unixMut
26e0: 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
26f0: 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2700: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
2710: 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
2720: 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
2730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2740: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
2750: 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
2760: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
2770: 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ..**.**   unixEn
2780: 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
2790: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
27a0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
27b0: 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65    unixEnterLeave
27c0: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
27d0: 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  d unixEnterMutex
27e0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
27f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
2800: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
2810: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
2820: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
2830: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2840: 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
2850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
2860: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
2870: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
2880: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
2890: 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66  STER));.}.#ifdef
28a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
28b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74  atic int unixMut
28c0: 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
28d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
28e0: 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
28f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
2900: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
2910: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
2920: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
2930: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2940: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
2950: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
2960: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
2970: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
2980: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
2990: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
29a0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
29b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
29c0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
29d0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
29e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
29f0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
2a00: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
2a10: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
2a20: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
2a30: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
2a40: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
2a50: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
2a60: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
2a70: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
2a80: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
2a90: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
2aa0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
2ab0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
2ac0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
2ad0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
2ae0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
2af0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
2b00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
2b10: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
2b20: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
2b30: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
2b40: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
2b50: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
2b60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b70: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
2b80: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
2b90: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
2ba0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
2bb0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
2bc0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
2bd0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
2be0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
2bf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
2c00: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
2c10: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
2c20: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
2c30: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2c40: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
2c50: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
2c60: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
2c70: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
2c80: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
2c90: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
2ca0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
2cb0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
2cc0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
2cd0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
2ce0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2cf0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
2d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
2d10: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
2d20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
2d30: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
2d40: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
2d50: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
2d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
2d70: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
2d80: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
2d90: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
2da0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
2db0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2dc0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
2dd0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
2de0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
2df0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
2e00: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
2e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2e20: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
2e30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
2e40: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
2e50: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
2e60: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
2e70: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
2e80: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
2e90: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
2ea0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
2eb0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
2ec0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
2ed0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
2ee0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
2ef0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
2f00: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
2f10: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
2f20: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
2f30: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
2f40: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
2f50: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
2f60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
2f70: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
2f80: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
2f90: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
2fa0: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
2fb0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
2fc0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
2fd0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2fe0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2ff0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
3000: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
3010: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
3020: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
3030: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
3040: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
3050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
3060: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
3070: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
3080: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
3090: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
30a0: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
30b0: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
30c0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
30d0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
30e0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
30f0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
3100: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
3110: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
3120: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
3130: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
3140: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a  K_TRACE */.../*.
3150: 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63 61  ** Retry ftrunca
3160: 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20  te() calls that 
3170: 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54  fail due to EINT
3180: 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54  R.*/.#ifdef EINT
3190: 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  R.static int rob
31a0: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
31b0: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
31c0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
31d0: 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 74 72  ;.  do{ rc = ftr
31e0: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
31f0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
3200: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
3210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
3220: 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75  se.# define robu
3230: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 61 2c 62  st_ftruncate(a,b
3240: 29 20 66 74 72 75 6e 63 61 74 65 28 61 2c 62 29  ) ftruncate(a,b)
3250: 0a 23 65 6e 64 69 66 20 0a 0a 0a 2f 2a 0a 2a 2a  .#endif .../*.**
3260: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
3270: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
3280: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
3290: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
32a0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
32b0: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
32c0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
32d0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
32e0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
32f0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
3300: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
3310: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
3320: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
3330: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
3340: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
3350: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
3360: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
3370: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
3380: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
3390: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
33a0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
33b0: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
33c0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
33d0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
33e0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
33f0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
3400: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
3410: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
3420: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
3430: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
3440: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
3450: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
3460: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
3470: 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73 65  xError) {.  case
3480: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
3490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
34a0: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
34b0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
34c0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
34d0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
34e0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
34f0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
3500: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
3510: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
3520: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
3530: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
3540: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
3550: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
3560: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
3570: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3580: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
3590: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
35a0: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
35b0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
35c0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
35d0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
35e0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
35f0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
3600: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3610: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
3620: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
3630: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
3640: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
3650: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
3660: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
3670: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
3680: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
3690: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
36a0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
36b0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
36c0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
36d0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
36e0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
36f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3700: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63  E_PERM;.    .  c
3710: 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20  ase EDEADLK:.   
3720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3730: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
3740: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
3750: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
3760: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
3770: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
3780: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
3790: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
37a0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
37b0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
37c0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
37d0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
37e0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
37f0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
3800: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
3810: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
3820: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
3830: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
3840: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
3850: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
3860: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
3870: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
3880: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
3890: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
38a0: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
38b0: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
38c0: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
38d0: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
38e0: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
38f0: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
3900: 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  T:.  case ESTALE
3910: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  :.  case ENOSYS:
3920: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
3930: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
3940: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
3950: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
3960: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
3970: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
3980: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
3990: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
39a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
39f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
3a00: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
3a10: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
3a20: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
3a40: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
3a50: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
3a60: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
3a70: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
3a80: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
3a90: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
3aa0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
3ab0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
3ac0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
3ad0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
3ae0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
3af0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
3b00: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
3b10: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
3b20: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
3b30: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3b40: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3b50: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3b60: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
3b70: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
3b80: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
3b90: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
3ba0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3bb0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
3bc0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
3bd0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
3be0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
3bf0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
3c00: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
3c10: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
3c20: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
3c30: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
3c40: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
3c50: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
3c60: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
3c70: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
3c80: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
3c90: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
3ca0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
3cb0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
3cc0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
3cd0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
3ce0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
3cf0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
3d00: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
3d10: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
3d20: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
3d30: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
3d40: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
3d50: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
3d60: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
3d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3d80: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
3d90: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
3da0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
3dd0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
3de0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
3df0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
3e00: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
3e10: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
3e20: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
3e30: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
3e40: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
3e50: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
3e60: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
3e70: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
3e80: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
3e90: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
3ea0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
3eb0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
3ec0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
3ed0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
3ee0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
3ef0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
3f00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3f10: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
3f20: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
3f30: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
3f40: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
3f50: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
3f60: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
3f70: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
3f80: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
3f90: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
3fa0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
3fb0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
3fc0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
3fd0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
3fe0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3ff0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
4000: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
4010: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
4020: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
4030: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
4040: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
4050: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
4060: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
4070: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
4080: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
4090: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
40a0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
40b0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
40d0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
40e0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
40f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4100: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
4110: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
4120: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
4130: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
4140: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4160: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
4170: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
4180: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
4190: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
41a0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
41b0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
41c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
41d0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
41e0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
41f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4210: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
4220: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
4230: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
4240: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
4250: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
4260: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
4270: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
4280: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
4290: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
42a0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
42b0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
42c0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
42d0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
42e0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
42f0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
4300: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
4310: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
4320: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
4330: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
4340: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4350: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
4360: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
4370: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
4380: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
4390: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
43a0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
43b0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
43c0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
43d0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
43e0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
43f0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
4400: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
4410: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
4420: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
4440: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
4450: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
4460: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
4470: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
4480: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
4490: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
44a0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44d0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
44e0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
44f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
4500: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
4510: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
4520: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
4530: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
4540: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4550: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
4560: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
4570: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4580: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
4590: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
45a0: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
45b0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
45c0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
45d0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
45e0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
45f0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
4600: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
4610: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
4620: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
4630: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
4640: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
4650: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
4660: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
4670: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
4680: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
4690: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
46a0: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
46b0: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
46c0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
46d0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
46e0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
46f0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
4700: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
4710: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
4720: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
4730: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
4740: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
4750: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
4760: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
4770: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
4780: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
4790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
47a0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
47b0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
47c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
47d0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
47e0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
47f0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
4800: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
4810: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
4820: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
4830: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
4840: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
4850: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
4860: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
4870: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
4880: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
4890: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
48a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
48b0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
48c0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
48d0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
48e0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
48f0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
4900: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
4910: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
4920: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4930: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
4940: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
4950: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
4960: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
4970: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
4980: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
4990: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
49a0: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
49b0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
49c0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
49d0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
49e0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
49f0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
4a00: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
4a10: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
4a20: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
4a30: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
4a40: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
4a50: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
4a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4a70: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
4a80: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
4a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
4aa0: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
4ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
4ac0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
4ad0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
4ae0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
4af0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
4b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b40: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
4b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
4ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4bb0: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
4bc0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
4bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
4bf0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
4c00: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
4c10: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
4c20: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
4c30: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
4c40: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
4c50: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
4c60: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
4c70: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
4c80: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
4c90: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
4ca0: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
4cb0: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
4cc0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
4cd0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
4ce0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
4cf0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
4d00: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
4d10: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
4d20: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
4d30: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
4d40: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
4d50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d60: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
4d70: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
4d80: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
4d90: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
4da0: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
4db0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
4dc0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
4dd0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
4de0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
4df0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
4e00: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
4e10: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
4e20: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
4e30: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
4e40: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
4e50: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
4e60: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
4e70: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
4e80: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
4e90: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
4ea0: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
4eb0: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
4ec0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
4ed0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
4ee0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
4ef0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
4f00: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
4f10: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
4f20: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
4f30: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
4f40: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
4f50: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
4f60: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
4f70: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
4f80: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
4f90: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
4fa0: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
4fb0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
4fc0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
4fd0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
4fe0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
4ff0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
5000: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
5010: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
5020: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
5030: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
5040: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
5050: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
5060: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
5070: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
5080: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
5090: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
50a0: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
50b0: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
50c0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
50d0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
50e0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
50f0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5100: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
5110: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
5120: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
5130: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
5140: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
5150: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
5160: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
5170: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
5180: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
5190: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
51a0: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
51b0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
51c0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
51d0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
51e0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
51f0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
5200: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
5210: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
5220: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
5230: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
5240: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
5250: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
5260: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
5270: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
5280: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
5290: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
52a0: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
52b0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
52c0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
52d0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
52e0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
52f0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
5300: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
5310: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
5320: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
5330: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
5340: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
5350: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
5360: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
5370: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
5380: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
5390: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
53a0: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
53b0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
53c0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
53d0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
53e0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
53f0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
5400: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
5410: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
5420: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
5430: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
5440: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
5450: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
5460: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
5470: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
5480: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
5490: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
54a0: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
54b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
54c0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
54d0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
54e0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
54f0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
5500: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
5510: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
5520: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
5530: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
5540: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
5550: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
5560: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5570: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
5580: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
5590: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
55a0: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
55b0: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
55c0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
55d0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
55e0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
55f0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
5600: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
5610: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
5620: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
5630: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5640: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
5650: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
5660: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
5670: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
5680: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
5690: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
56a0: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
56b0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
56c0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
56d0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
56e0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
56f0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
5700: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
5710: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
5720: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
5730: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
5740: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
5750: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
5760: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
5770: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
5780: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
5790: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
57a0: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
57b0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
57c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
57d0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
57e0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
57f0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
5800: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
5810: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
5820: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
5830: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
5840: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
5850: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
5860: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
5870: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
5880: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
5890: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
58a0: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
58b0: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
58c0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
58d0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
58e0: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
58f0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
5900: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
5910: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
5920: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
5930: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
5940: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
5950: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
5960: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
5970: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
5980: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
5990: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
59a0: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
59b0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
59c0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
59d0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
59e0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
59f0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
5a00: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
5a10: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
5a20: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
5a30: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
5a40: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
5a50: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
5a60: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
5a70: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
5a80: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
5a90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
5aa0: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
5ab0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
5ac0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
5ad0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
5ae0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
5af0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
5b00: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
5b10: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
5b20: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
5b30: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
5b40: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
5b50: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
5b60: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
5b70: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
5b80: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
5b90: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
5ba0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
5bb0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
5bc0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
5bd0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
5be0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
5bf0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
5c00: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
5c10: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
5c20: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
5c30: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
5c40: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
5c50: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
5c60: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
5c70: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
5c80: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
5c90: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
5ca0: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
5cb0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
5cc0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
5cd0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
5ce0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
5cf0: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
5d00: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
5d10: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
5d20: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
5d30: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
5d40: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
5d50: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
5d60: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
5d70: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
5d80: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
5d90: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
5da0: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
5db0: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
5dc0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
5dd0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
5de0: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
5df0: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
5e00: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
5e10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
5e20: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
5e30: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
5e40: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
5e50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e60: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
5e70: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
5e80: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
5e90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5ea0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
5eb0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
5ec0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
5ed0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
5ee0: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
5ef0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
5f00: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
5f10: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f30: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
5f40: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
5f50: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
5f60: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
5f70: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
5f80: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
5f90: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
5fa0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
5fb0: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
5fc0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
5fd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
5fe0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5ff0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6000: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
6010: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
6020: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
6030: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
6040: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
6050: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
6060: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
6070: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
6080: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
6090: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
60a0: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
60b0: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
60c0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
60d0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
60e0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
60f0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6100: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
6110: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
6120: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
6130: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
6140: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
6150: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
6160: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
6170: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
6180: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
6190: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
61a0: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
61b0: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
61c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
61d0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
61e0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  ocks held */.  i
61f0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  nt eFileLock;   
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6210: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
6220: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
6230: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  OCK etc. */.  in
6240: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6260: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
6270: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
6280: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
6290: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
62a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
62b0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
62c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
62d0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
62e0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6300: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
6310: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
6320: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
6330: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
6340: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
6350: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
6360: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
6370: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
6380: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
6390: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
63a0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
63b0: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
63c0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
63e0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
63f0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6400: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
6410: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 20 20 75  CKING_STYLE).  u
6420: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
6430: 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f  g sharedByte;  /
6440: 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61  * for AFP simula
6450: 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  ted shared lock 
6460: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
6470: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74  _VXWORKS.  sem_t
6480: 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20   *pSem;         
6490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
64a0: 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68  med POSIX semaph
64b0: 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  ore */.  char aS
64c0: 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  emName[MAX_PATHN
64d0: 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65  AME+2];  /* Name
64e0: 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f   of that semapho
64f0: 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  re */.#endif.};.
6500: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f  ./*.** A lists o
6510: 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49  f all unixInodeI
6520: 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  nfo objects..*/.
6530: 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65  static unixInode
6540: 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20  Info *inodeList 
6550: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  = 0;../*.**.** T
6560: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75  his function - u
6570: 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c  nixLogError_x(),
6580: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
6590: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
65a0: 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72  ro.** unixLogErr
65b0: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  or()..**.** It i
65c0: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
65d0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
65e0: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
65f0: 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20  n and errno has 
6600: 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20  been.** set. It 
6610: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
6620: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
6630: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
6640: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
6650: 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c  of.** errno and,
6660: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
6670: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
6680: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
6690: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a   strerror() or.*
66a0: 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  * strerror_r()..
66b0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
66c0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
66d0: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
66e0: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
66f0: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
6700: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
6710: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
6720: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
6730: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
6740: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
6750: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
6760: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
6770: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6780: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
6790: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67  t.** failed (e.g
67a0: 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65  . "unlink", "ope
67b0: 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65 20  n") and the the 
67c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
67d0: 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20  system path,.** 
67e0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
67f0: 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ne unixLogError(
6800: 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c  a,b,c)     unixL
6810: 6f 67 45 72 72 6f 72 5f 78 28 61 2c 62 2c 63 2c  ogError_x(a,b,c,
6820: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
6830: 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f   int unixLogErro
6840: 72 5f 78 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  r_x(.  int errco
6850: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
6860: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
6870: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
6880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
6890: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
68a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
68b0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
68c0: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
68d0: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
68e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
68f0: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
6900: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
6910: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
6940: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
6950: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
6960: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
6990: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
69a0: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
69b0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
69c0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
69d0: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
69e0: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
69f0: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
6a00: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
6a10: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
6a20: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
6a30: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
6a40: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
6a50: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
6a60: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
6a70: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
6a80: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
6a90: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
6aa0: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
6ab0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
6ac0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
6ad0: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
6ae0: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
6af0: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
6b00: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
6b10: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
6b20: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
6b30: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
6b40: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
6b50: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
6b60: 64 65 73 20 74 68 65 20 74 68 65 20 47 4e 55 20  des the the GNU 
6b70: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
6b80: 72 6f 72 5f 72 28 29 20 74 68 61 74 20 0a 20 20  ror_r() that .  
6b90: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
6ba0: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
6bb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6bc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
6bd0: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
6be0: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
6bf0: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
6c00: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
6c10: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
6c20: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
6c30: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
6c40: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
6c50: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
6c60: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
6c70: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
6c80: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
6c90: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
6ca0: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
6cb0: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
6cc0: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
6cd0: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
6ce0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
6cf0: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
6d00: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
6d10: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
6d20: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
6d30: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
6d40: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
6d50: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
6d60: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
6d70: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
6d80: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
6d90: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
6da0: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
6db0: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
6dc0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
6dd0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
6de0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
6df0: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
6e00: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
6e10: 72 72 6f 72 5f 72 28 65 72 72 6e 6f 2c 20 61 45  rror_r(errno, aE
6e20: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
6e30: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
6e40: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
6e50: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
6e60: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
6e70: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
6e80: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
6e90: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
6ea0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
6eb0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
6ec0: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
6ed0: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
6ee0: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 3b 0a  trerror(errno);.
6ef0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
6f00: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
6f10: 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
6f20: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
6f30: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
6f40: 20 25 73 28 29 20 61 74 20 6c 69 6e 65 20 25 64   %s() at line %d
6f50: 20 2d 20 5c 22 25 73 5c 22 20 65 72 72 6e 6f 3d   - \"%s\" errno=
6f60: 25 64 20 70 61 74 68 3d 25 73 22 2c 0a 20 20 20  %d path=%s",.   
6f70: 20 20 20 7a 46 75 6e 63 2c 20 69 4c 69 6e 65 2c     zFunc, iLine,
6f80: 20 7a 45 72 72 2c 20 65 72 72 6e 6f 2c 20 28 7a   zErr, errno, (z
6f90: 50 61 74 68 20 3f 20 7a 50 61 74 68 20 3a 20 22  Path ? zPath : "
6fa0: 6e 2f 61 22 29 0a 20 20 29 3b 0a 0a 20 20 72 65  n/a").  );..  re
6fb0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
6fc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
6fd0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6fe0: 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e  rs accumuated in
6ff0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
7000: 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  fo->pUnused list
7010: 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 63 68  ..** If all such
7020: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7030: 73 20 61 72 65 20 63 6c 6f 73 65 64 20 77 69 74  s are closed wit
7040: 68 6f 75 74 20 65 72 72 6f 72 2c 20 74 68 65 20  hout error, the 
7050: 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c 65 61 72  list is.** clear
7060: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
7070: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7080: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
7090: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
70a0: 74 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  then successfull
70b0: 79 20 63 6c 6f 73 65 64 20 66 69 6c 65 20 64 65  y closed file de
70c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65 6e 74 72  scriptor.** entr
70d0: 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64 20  ies are removed 
70e0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2c 20 61  from the list, a
70f0: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  nd SQLITE_IOERR_
7100: 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64 2e 20  CLOSE returned. 
7110: 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74 65 64 20  .** not deleted 
7120: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
7130: 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65 64 2e  _CLOSE returned.
7140: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
7150: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
7160: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
7170: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7180: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 49 6e  ITE_OK;.  unixIn
7190: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
71a0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
71b0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
71c0: 2a 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 55  *pError = 0;.  U
71d0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a  nixUnusedFd *p;.
71e0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
71f0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
7200: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
7210: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
7220: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
7230: 74 3b 0a 20 20 20 20 69 66 28 20 63 6c 6f 73 65  t;.    if( close
7240: 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  (p->fd) ){.     
7250: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7260: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
7270: 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
7280: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
7290: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 20  CLOSE, "close", 
72a0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
72b0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
72c0: 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 70 45  pError;.      pE
72d0: 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20 7d 65  rror = p;.    }e
72e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
72f0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
7300: 7d 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e  }.  }.  pInode->
7310: 70 55 6e 75 73 65 64 20 3d 20 70 45 72 72 6f 72  pUnused = pError
7320: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7330: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7340: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
7350: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
7360: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
7370: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
7380: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
7390: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
73a0: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
73b0: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
73c0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
73d0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
73e0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
73f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
7400: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
7410: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
7420: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
7430: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
7440: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
7450: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
7460: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 6f 64  ) );.  if( pInod
7470: 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  e ){.    pInode-
7480: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7490: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30   pInode->nRef==0
74a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
74b0: 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ( pInode->pShmNo
74c0: 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  de==0 );.      c
74d0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
74e0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
74f0: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29   pInode->pPrev )
7500: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7510: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d  ( pInode->pPrev-
7520: 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29  >pNext==pInode )
7530: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
7540: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
7550: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
7560: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7570: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f       assert( ino
7580: 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29  deList==pInode )
7590: 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c  ;.        inodeL
75a0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ist = pInode->pN
75b0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
75c0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
75d0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
75e0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
75f0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49  pNext->pPrev==pI
7600: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
7610: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
7620: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Prev = pInode->p
7630: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
7640: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7650: 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  (pInode);.    }.
7660: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
7670: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
7680: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65  ptor, locate the
7690: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
76a0: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65  bject that.** de
76b0: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
76c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
76d0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
76e0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
76f0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
7700: 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  ue might be unin
7710: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
7720: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
7730: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
7740: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
7750: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7760: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
7770: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
7780: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7790: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
77a0: 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  turn an appropri
77b0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
77c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
77d0: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75  ndInodeInfo(.  u
77e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7800: 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20   Unix file with 
7810: 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69  file desc used i
7820: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75  n the key */.  u
7830: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70  nixInodeInfo **p
7840: 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a  pInode        /*
7850: 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78   Return the unix
7860: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
7870: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
7880: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
78a0: 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75  System call retu
78b0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
78c0: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
78e0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
78f0: 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a  or for pFile */.
7900: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
7910: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
7920: 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66   /* Lookup key f
7930: 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  or the unixInode
7940: 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74  Info */.  struct
7950: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
7970: 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
7980: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78  mation */.  unix
7990: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
79a0: 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61  e = 0;     /* Ca
79b0: 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64  ndidate unixInod
79c0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  eInfo object */.
79d0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
79e0: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20  utexHeld() );.. 
79f0: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
7a00: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
7a10: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
7a20: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
7a30: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
7a40: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
7a50: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
7a60: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
7a70: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
7a80: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
7a90: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
7aa0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7ab0: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
7ac0: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
7ad0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
7ae0: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
7af0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
7b00: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
7b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7b20: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
7b30: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
7b40: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
7b50: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
7b60: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
7b70: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
7b80: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
7b90: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
7ba0: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
7bb0: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
7bc0: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
7bd0: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
7be0: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
7bf0: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
7c00: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
7c10: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
7c20: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
7c30: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
7c40: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
7c50: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
7c60: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
7c70: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
7c80: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
7c90: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
7ca0: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
7cb0: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
7cc0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
7cd0: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
7ce0: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
7cf0: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
7d00: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
7d10: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
7d20: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
7d30: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
7d40: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
7d50: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
7d60: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
7d70: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
7d80: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
7d90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
7da0: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
7db0: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
7dc0: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
7dd0: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
7de0: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
7df0: 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  write(fd, "S", 1
7e00: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
7e10: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
7e20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
7e30: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
7e40: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
7e50: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
7e60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7e70: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73     }.    rc = fs
7e80: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
7e90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
7ea0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
7eb0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
7ec0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
7ed0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7ee0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7ef0: 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49  .  memset(&fileI
7f00: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c  d, 0, sizeof(fil
7f10: 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e  eId));.  fileId.
7f20: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
7f30: 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57  _dev;.#if OS_VXW
7f40: 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49  ORKS.  fileId.pI
7f50: 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a  d = pFile->pId;.
7f60: 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69  #else.  fileId.i
7f70: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
7f80: 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49  ino;.#endif.  pI
7f90: 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
7fa0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64  ;.  while( pInod
7fb0: 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c  e && memcmp(&fil
7fc0: 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69  eId, &pInode->fi
7fd0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
7fe0: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e  eId)) ){.    pIn
7ff0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
8000: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
8010: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
8020: 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  pInode = sqlite3
8030: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
8040: 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20  *pInode) );.    
8050: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
8060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8070: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8080: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e  }.    memset(pIn
8090: 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
80a0: 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65  pInode));.    me
80b0: 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69  mcpy(&pInode->fi
80c0: 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73  leId, &fileId, s
80d0: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
80e0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
80f0: 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65   = 1;.    pInode
8100: 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c  ->pNext = inodeL
8110: 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ist;.    pInode-
8120: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
8130: 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20  if( inodeList ) 
8140: 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76  inodeList->pPrev
8150: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69   = pInode;.    i
8160: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
8170: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
8180: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pInode->nRef++;.
8190: 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d    }.  *ppInode =
81a0: 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72   pInode;.  retur
81b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
81c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
81d0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
81e0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
81f0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
8200: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
8210: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
8220: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
8230: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
8240: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
8250: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
8260: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
8270: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
8280: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
8290: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
82a0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
82b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
82c0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
82d0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
82e0: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
82f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
8300: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
8310: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
8320: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
8330: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8340: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
8350: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
8360: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
8370: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
8380: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
8390: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
83a0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
83b0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
83c0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
83d0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
83e0: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
83f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
8400: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
8410: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
8420: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
8430: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
8440: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
8450: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
8460: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
8470: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
8480: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
8490: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
84a0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
84b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
84c0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
84d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
84e0: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
84f0: 72 76 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75  rved ){.    stru
8500: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8510: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
8520: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
8530: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
8540: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
8550: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
8560: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
8570: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
8580: 20 20 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74    if (-1 == fcnt
8590: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
85a0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20  TLK, &lock)) {. 
85b0: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
85c0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
85d0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
85e0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
85f0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
8600: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
8610: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69  LOCK);.      pFi
8620: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
8630: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c  tErrno;.    } el
8640: 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
8650: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
8660: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
8670: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  1;.    }.  }.#en
8680: 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61  dif.  .  unixLea
8690: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
86a0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
86b0: 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e  OCK %d %d %d (un
86c0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
86d0: 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
86e0: 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
86f0: 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
8700: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8710: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
8720: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
8730: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
8740: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
8750: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
8760: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
8770: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
8780: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
8790: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
87a0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
87b0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
87c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
87d0: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
87e0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
87f0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
8800: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
8810: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
8820: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
8830: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
8840: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
8850: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
8860: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
8870: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
8880: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
8890: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
88a0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
88b0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
88c0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
88d0: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
88e0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
88f0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
8900: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
8910: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
8920: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
8930: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
8940: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
8950: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
8960: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
8970: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
8980: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
8990: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
89a0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
89b0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
89c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
89d0: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
89e0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
89f0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
8a00: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
8a10: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
8a20: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
8a30: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
8a40: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
8a50: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
8a60: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
8a70: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
8a80: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
8a90: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
8aa0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
8ab0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
8ac0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
8ad0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
8ae0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
8af0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
8b00: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
8b10: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
8b20: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
8b30: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
8b40: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
8b50: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
8b60: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
8b70: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
8b80: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
8b90: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
8ba0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
8bb0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
8bc0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
8bd0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
8be0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
8bf0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
8c00: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
8c10: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
8c20: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
8c30: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
8c40: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
8c50: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
8c60: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
8c70: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
8c80: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
8c90: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
8ca0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
8cb0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
8cc0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
8cd0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
8ce0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
8cf0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
8d00: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
8d10: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
8d20: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
8d30: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
8d40: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
8d50: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
8d60: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
8d70: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
8d80: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
8d90: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
8da0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
8db0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
8dc0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
8dd0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
8de0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
8df0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
8e00: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
8e10: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
8e20: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
8e30: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
8e40: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
8e50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
8e60: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
8e70: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
8e80: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
8e90: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
8ea0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
8eb0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
8ec0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
8ed0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
8ee0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
8ef0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
8f00: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
8f10: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
8f20: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
8f30: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
8f40: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
8f50: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
8f60: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
8f70: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
8f80: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
8f90: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
8fa0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
8fb0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
8fc0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
8fd0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
8fe0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
8ff0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
9000: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
9010: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
9020: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
9030: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
9040: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
9050: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
9060: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
9070: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
9080: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
9090: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
90a0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
90b0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
90c0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
90d0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
90e0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
90f0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
9100: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
9110: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
9120: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
9130: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
9140: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
9150: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
9160: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
9170: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
9180: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
9190: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
91a0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
91b0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
91c0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
91d0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
91e0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
91f0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
9200: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
9210: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
9220: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
9230: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
9240: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
9250: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
9260: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
9270: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
9280: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
9290: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
92a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
92b0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
92c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
92d0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
92e0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
92f0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9300: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
9310: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20  k lock;.  int s 
9320: 3d 20 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  = 0;.  int tErrn
9330: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
9340: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
9350: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
9360: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
9370: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
9380: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
9390: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
93a0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
93b0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
93c0: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
93d0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
93e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
93f0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
9400: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
9410: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
9420: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
9430: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
9440: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
9450: 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
9460: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
9470: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
9480: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
9490: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
94a0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
94b0: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
94c0: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
94d0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
94e0: 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
94f0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
9500: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
9510: 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e  lready held) (un
9520: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
9530: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  ,.            az
9540: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
9550: 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
9560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9570: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9580: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
9590: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
95a0: 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  ..  **  (1) We n
95b0: 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
95c0: 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
95d0: 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
95e0: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
95f0: 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
9600: 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
9610: 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
9620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
9630: 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
9640: 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
9650: 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
9660: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
9670: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9680: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
9690: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
96a0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
96b0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
96c0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
96d0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
96e0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
96f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
9700: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
9710: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
9720: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
9730: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
9740: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
9750: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
9760: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
9770: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9780: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
9790: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
97a0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
97b0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
97c0: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
97d0: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
97e0: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
97f0: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
9800: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
9810: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
9820: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
9830: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
9840: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
9850: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
9860: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
9870: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
9880: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
9890: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
98a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
98b0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
98c0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
98d0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
98e0: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
98f0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
9900: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
9910: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
9920: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
9930: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
9940: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
9950: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
9960: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
9970: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
9980: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
9990: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
99a0: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
99b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
99c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
99d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
99e0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
99f0: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
9a00: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
9a10: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
9a20: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
9a30: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
9a40: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
9a50: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
9a60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
9a70: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
9a80: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
9a90: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
9aa0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
9ab0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
9ac0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
9ad0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
9ae0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
9af0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
9b00: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
9b10: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
9b20: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
9b30: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
9b40: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
9b50: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
9b60: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
9b70: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
9b80: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
9b90: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
9ba0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
9bb0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
9bc0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
9bd0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
9be0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
9bf0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
9c00: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
9c10: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
9c20: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
9c30: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
9c40: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
9c50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
9c60: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
9c70: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
9c80: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
9c90: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
9ca0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
9cb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9cc0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
9cd0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
9ce0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
9cf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c  ;.      if( IS_L
9d00: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
9d10: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
9d20: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
9d30: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
9d40: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
9d60: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
9d70: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
9d80: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
9d90: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
9da0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
9db0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
9dc0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
9dd0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
9de0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
9df0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
9e00: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
9e10: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
9e20: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
9e30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
9e40: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
9e50: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
9e60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
9e70: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
9e80: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
9e90: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
9ea0: 20 20 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e      if( (s = fcn
9eb0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
9ec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28  ETLK, &lock))==(
9ed0: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  -1) ){.      tEr
9ee0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
9ef0: 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
9f00: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
9f10: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
9f20: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9f30: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
9f40: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
9f50: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
9f60: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
9f70: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
9f80: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
9f90: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
9fa0: 20 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b    if( s != -1 ){
9fb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
9fc0: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
9fd0: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
9fe0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45  nt */.        tE
9ff0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20  rrno = errno; . 
a000: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a010: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
a020: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
a030: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
a040: 4b 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28  K); .        if(
a050: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
a060: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
a070: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a080: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
a090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
a0a0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
a0b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
a0c0: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
a0d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
a0e0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
a0f0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
a100: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
a110: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
a120: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
a130: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a140: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
a150: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a160: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
a170: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
a180: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
a190: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
a1a0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
a1b0: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
a1c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
a1d0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
a1e0: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
a1f0: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
a200: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
a210: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
a220: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
a230: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
a240: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
a250: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
a260: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
a270: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
a280: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
a290: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a2a0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
a2b0: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
a2c0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
a2d0: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
a2e0: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
a2f0: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
a300: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
a310: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
a320: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
a330: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
a340: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
a350: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
a360: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
a370: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 46  ;.    switch( eF
a380: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ileLock ){.     
a390: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
a3a0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a3b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
a3c0: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
a3d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a3e0: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
a3f0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63  OCK:.        loc
a400: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a410: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
a420: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
a430: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
a440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a450: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a460: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
a470: 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c   }.    s = fcntl
a480: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
a490: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a4a0: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
a4b0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
a4c0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
a4d0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
a4e0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
a4f0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
a500: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
a510: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
a520: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
a530: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
a540: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
a550: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
a560: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
a570: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
a580: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
a590: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
a5a0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
a5b0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
a5c0: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
a5d0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
a5e0: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
a5f0: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
a600: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
a610: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
a620: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
a630: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
a640: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
a650: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
a660: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
a670: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
a680: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
a690: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
a6a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
a6b0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
a6c0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
a6d0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
a6e0: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
a6f0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
a700: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
a710: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
a720: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a730: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
a740: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
a750: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
a760: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
a770: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
a780: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
a790: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
a7a0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
a7b0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
a7c0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
a7d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
a7e0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
a7f0: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
a800: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
a810: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
a820: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
a830: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
a840: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
a850: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
a860: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
a870: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
a880: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
a890: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
a8a0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a8b0: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
a8c0: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
a8d0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
a8e0: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
a8f0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
a900: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
a910: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
a920: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
a930: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
a940: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
a950: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
a960: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20  File->pUnused;. 
a970: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f   p->pNext = pIno
a980: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  de->pUnused;.  p
a990: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
a9a0: 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d   p;.  pFile->h =
a9b0: 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55   -1;.  pFile->pU
a9c0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
a9d0: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
a9e0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
a9f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
aa00: 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
aa10: 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
aa20: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
aa30: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
aa40: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
aa50: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
aa60: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
aa70: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
aa80: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
aa90: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
aaa0: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
aab0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
aac0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a   a no-op..** .**
aad0: 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c   If handleNFSUnl
aae0: 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65  ock is true, the
aaf0: 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67  n on downgrading
ab00: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   an EXCLUSIVE_LO
ab10: 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20  CK to SHARED.** 
ab20: 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69  the byte range i
ab30: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32  s divided into 2
ab40: 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66   parts and the f
ab50: 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c  irst part is unl
ab60: 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65  ocked then.** se
ab70: 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b  t to a read lock
ab80: 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72  , then the other
ab90: 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20   part is simply 
aba0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  unlocked.  This 
abb0: 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64  works .** around
abc0: 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46   a bug in BSD NF
abd0: 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65  S lockd (also se
abe0: 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e  en on MacOSX 10.
abf0: 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74  3+) that fails t
ac00: 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o .** remove the
ac10: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61   write lock on a
ac20: 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72   region when a r
ac30: 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e  ead lock is set.
ac40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f  .*/.static int _
ac50: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
ac60: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
ac70: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
ac80: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
ac90: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
aca0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
acb0: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
acc0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
acd0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ace0: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
acf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
ad00: 68 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b  h;.  int tErrno;
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
ad30: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
ad40: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a  call errors */..
ad50: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
ad60: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
ad70: 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
ad80: 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
ad90: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
ada0: 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
adb0: 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
adc0: 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
add0: 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
ade0: 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
adf0: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
ae00: 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
ae10: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
ae20: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
ae30: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ae40: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
ae50: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
ae60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ae70: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
ae80: 65 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c  ex();.  h = pFil
ae90: 65 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  e->h;.  pInode =
aea0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
aeb0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
aec0: 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
aed0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
aee0: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
aef0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
af00: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
af10: 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
af20: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
af30: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
af40: 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
af50: 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
af60: 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
af70: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
af80: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
af90: 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
afa0: 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
afb0: 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
afc0: 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
afd0: 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
afe0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
aff0: 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
b000: 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
b010: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
b020: 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
b030: 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
b040: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b050: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
b060: 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
b070: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
b080: 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
b090: 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
b0a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
b0b0: 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
b0c0: 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
b0d0: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
b0e0: 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
b0f0: 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
b100: 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
b110: 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
b120: 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
b130: 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
b140: 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
b150: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
b160: 20 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20      */.#if 0.   
b170: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
b180: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
b190: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69  .         || pFi
b1a0: 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
b1b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
b1c0: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
b1d0: 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==1 );.#endif.  
b1e0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
b1f0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
b200: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
b210: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
b220: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
b230: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
b240: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
b250: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
b260: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
b270: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
b280: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
b290: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
b2a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
b2b0: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
b2c0: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
b2d0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
b2e0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
b2f0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
b300: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
b310: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
b320: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
b330: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
b340: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
b350: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
b360: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
b370: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
b380: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
b390: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
b3a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  OCK ){.      if(
b3b0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
b3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   ){.        off_
b3d0: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
b3e0: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
b3f0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
b400: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
b410: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
b420: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
b430: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
b440: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
b450: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
b460: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b470: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
b480: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
b490: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
b4a0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
b4b0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
b4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
b4d0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
b4e0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
b4f0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
b500: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  UNLOCK);.       
b510: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b520: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b530: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b540: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
b550: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
b560: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
b570: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
b580: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
b590: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
b5a0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
b5b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b5c0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
b5d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
b5e0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
b5f0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
b600: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
b610: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
b620: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
b630: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
b640: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
b650: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
b660: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
b670: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
b680: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
b690: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
b6a0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
b6b0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
b6c0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b6d0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b6f0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
b700: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
b710: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
b720: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
b730: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b740: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
b750: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
b760: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b770: 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
b780: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
b790: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
b7a0: 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
b7b0: 20 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46    if( fcntl(h, F
b7c0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
b7d0: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
b7e0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
b7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
b800: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
b810: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
b820: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
b830: 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  UNLOCK);.       
b840: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
b850: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
b860: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b870: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
b880: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
b890: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
b8a0: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
b8b0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
b8c0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
b8d0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
b8e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
b8f0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b900: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
b910: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
b920: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
b930: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
b940: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
b950: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
b960: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28  SETLK, &lock)==(
b970: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
b980: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
b990: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b9a0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b9b0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b9c0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
b9d0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
b9e0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
b9f0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ba00: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
ba10: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
ba20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ba30: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ba40: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
ba50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ba60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ba70: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
ba80: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ba90: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
baa0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
bab0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
bac0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
bad0: 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
bae0: 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
baf0: 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
bb00: 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54  ( fcntl(h, F_SET
bb10: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
bb20: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
bb30: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
bb40: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
bb50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72  else{.      tErr
bb60: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
bb70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
bb80: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
bb90: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
bba0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
bbb0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
bbc0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
bbd0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
bbe0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
bbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
bc00: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
bc10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bc20: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
bc30: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
bc40: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
bc50: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
bc60: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
bc70: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
bc80: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
bc90: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
bca0: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
bcb0: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
bcc0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
bcd0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
bce0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
bcf0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
bd00: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
bd10: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
bd20: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
bd30: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bd40: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bd50: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
bd60: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
bd70: 4c 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  L;.      Simulat
bd80: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
bd90: 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
bda0: 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
bdb0: 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
bdc0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
bdd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  );.      if( fcn
bde0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
bdf0: 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20  lock)!=(-1) ){. 
be00: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
be10: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
be20: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
be30: 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20  .        tErrno 
be40: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
be50: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
be60: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
be70: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
be80: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
be90: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
bea0: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
beb0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
bec0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
bed0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
bee0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
bef0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
bf00: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
bf10: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
bf20: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
bf30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
bf40: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
bf50: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
bf60: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
bf70: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
bf80: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
bf90: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
bfa0: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
bfb0: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
bfc0: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
bfd0: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
bfe0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
bff0: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
c000: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
c010: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
c020: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
c030: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
c040: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
c050: 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c      int rc2 = cl
c060: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
c070: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
c080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c090: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
c0a0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
c0b0: 0a 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63  .  }...end_unloc
c0c0: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
c0d0: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
c0e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
c0f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
c100: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
c110: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c120: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
c130: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
c140: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
c150: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
c160: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
c170: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
c180: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
c190: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
c1a0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
c1b0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
c1c0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
c1d0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
c1e0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
c1f0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
c200: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c210: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
c220: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
c230: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c240: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
c250: 7b 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69  {.  return _posi
c260: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
c270: 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  eLock, 0);.}../*
c280: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c290: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
c2a0: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
c2b0: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
c2c0: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
c2d0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
c2e0: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
c2f0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
c300: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
c310: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
c320: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
c330: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
c340: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
c350: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
c360: 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
c370: 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
c380: 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
c390: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c3a0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
c3b0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
c3c0: 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
c3d0: 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
c3e0: 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
c3f0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
c400: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
c410: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
c420: 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
c430: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
c440: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c450: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
c460: 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  f( pFile ){.    
c470: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
c480: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
c490: 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69   err = close(pFi
c4a0: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20  le->dirfd);.    
c4b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
c4c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c4d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
c4e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
c4f0: 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
c500: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
c510: 45 2c 20 22 63 6c 6f 73 65 22 2c 20 70 46 69 6c  E, "close", pFil
c520: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
c530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c540: 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d 2d 31 3b  pFile->dirfd=-1;
c550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c560: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
c570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c580: 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
c590: 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28  e->h);.      if(
c5a0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
c5b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
c5c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c5d0: 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
c5e0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
c5f0: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
c600: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
c610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c620: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
c630: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
c640: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
c650: 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29  File->isDelete )
c660: 7b 0a 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b  {.        unlink
c670: 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61  (pFile->pId->zCa
c680: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
c690: 20 20 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f      }.      vxwo
c6a0: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
c6b0: 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
c6c0: 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
c6d0: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
c6e0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43  .    OSTRACE(("C
c6f0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
c700: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
c710: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
c720: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c730: 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  e(pFile->pUnused
c740: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  );.    memset(pF
c750: 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
c760: 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20  nixFile));.  }. 
c770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
c790: 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
c7a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
c7b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
c7c0: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
c7d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
c7e0: 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
c7f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c800: 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20  ixFile *)id;.   
c810: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
c820: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
c830: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
c840: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
c850: 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
c860: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
c870: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
c880: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
c890: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
c8a0: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
c8b0: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
c8c0: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
c8d0: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
c8e0: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
c8f0: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
c900: 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
c910: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
c920: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
c930: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
c940: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
c950: 6c 6f 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  losed .      ** 
c960: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
c970: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
c980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
c990: 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
c9a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
c9b0: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
c9c0: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ile);.    rc = c
c9d0: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
c9e0: 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
c9f0: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
ca00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
ca10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
ca20: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
ca30: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
ca40: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
ca50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
ca60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
cab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
cb00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
cb20: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
cb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
cb50: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
cb60: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
cb70: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
cb80: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
cb90: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
cba0: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
cbb0: 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
cbc0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
cbd0: 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
cbe0: 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
cbf0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
cc00: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
cc10: 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
cc20: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
cc30: 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
cc40: 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
cc50: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
cc60: 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
cc70: 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
cc80: 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
cc90: 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
cca0: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
ccb0: 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
ccc0: 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
ccd0: 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
cce0: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
ccf0: 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
cd00: 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
cd10: 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
cd20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
cd30: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
cd40: 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
cd50: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
cd60: 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
cd70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
cd80: 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
cd90: 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
cda0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
cdb0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
cdc0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
cdd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
cde0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
cdf0: 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
ce00: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
ce10: 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
ce20: 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
ce30: 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
ce40: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
ce50: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
ce60: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
ce70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ce80: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
ce90: 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
cea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ceb0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
cec0: 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
ced0: 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
cee0: 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
cef0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cf00: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
cf10: 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
cf20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
cf30: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
cf40: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
cf50: 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
cf60: 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
cf70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
cf80: 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
cf90: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
cfa0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cfb0: 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
cfc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
cfd0: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
cfe0: 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
cff0: 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
d000: 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
d010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d020: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
d030: 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
d040: 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
d050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
d060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
d0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
d120: 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
d130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
d150: 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
d160: 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
d170: 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
d180: 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 73 65   existance of se
d190: 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
d1a0: 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  iles in order to
d1b0: 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
d1c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
d1d0: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20    This works on 
d1e0: 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76  just.** about ev
d1f0: 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
d200: 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
d210: 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
d220: 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
d230: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
d240: 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
d250: 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
d260: 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
d270: 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
d280: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
d290: 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
d2a0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
d2b0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
d2c0: 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
d2d0: 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
d2e0: 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
d2f0: 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
d300: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
d310: 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
d320: 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
d330: 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
d340: 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
d350: 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
d360: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
d370: 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
d380: 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
d390: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
d3a0: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
d3b0: 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
d3c0: 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
d3d0: 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69  reating a file i
d3e0: 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
d3f0: 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a 20 64  tory as the.** d
d400: 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68  atabase and with
d410: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62   the same name b
d420: 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b  ut with a ".lock
d430: 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65  " extension adde
d440: 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 61  d..** The exista
d450: 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69  nce of a lock fi
d460: 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  le implies an EX
d470: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
d480: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a  ll other lock.**
d490: 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
d4a0: 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
d4b0: 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
d4c0: 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
d4d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
d4e0: 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
d4f0: 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
d500: 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
d510: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
d520: 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  * lock file..*/.
d530: 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
d540: 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
d550: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d560: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
d570: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
d580: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
d590: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
d5a0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
d5b0: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
d5c0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
d5d0: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
d5e0: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
d5f0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
d600: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
d610: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
d620: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
d630: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
d640: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
d650: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
d660: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
d670: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
d680: 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
d690: 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
d6a0: 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
d6b0: 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
d6c0: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
d6d0: 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
d6e0: 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
d6f0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
d700: 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
d710: 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
d720: 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
d730: 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
d740: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
d750: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
d760: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
d770: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
d780: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
d790: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d7a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
d7b0: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
d7c0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
d7d0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
d7e0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d7f0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
d800: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
d810: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
d820: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
d830: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
d840: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
d850: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
d860: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
d870: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d880: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
d890: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
d8a0: 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
d8b0: 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
d8c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
d8d0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
d8e0: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
d8f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
d900: 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
d910: 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
d920: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
d930: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
d940: 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
d950: 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
d960: 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
d970: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
d980: 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
d990: 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
d9a0: 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
d9b0: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
d9c0: 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28 7a  erved = access(z
d9d0: 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
d9e0: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
d9f0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
da00: 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
da10: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
da20: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
da30: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
da40: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
da50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
da60: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
da70: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
da80: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
da90: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
daa0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
dab0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
dac0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
dad0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
dae0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
daf0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
db00: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
db10: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
db20: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
db30: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
db40: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
db50: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
db60: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
db70: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
db80: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
db90: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
dba0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
dbb0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
dbc0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
dbd0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
dbe0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
dbf0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
dc00: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
dc10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
dc20: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
dc30: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
dc40: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
dc50: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
dc60: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
dc70: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
dc80: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
dc90: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
dca0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
dcb0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
dcc0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
dcd0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
dce0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
dcf0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
dd00: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
dd10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
dd20: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
dd30: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
dd40: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
dd50: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
dd60: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
dd70: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
dd80: 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
dd90: 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
dda0: 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
ddb0: 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
ddc0: 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
ddd0: 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
dde0: 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
ddf0: 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
de00: 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
de10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
de20: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
de30: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
de40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
de50: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
de60: 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
de70: 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
de80: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
de90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
dea0: 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49  ITE_OK;...  /* I
deb0: 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f  f we have any lo
dec0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ck, then the loc
ded0: 6b 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65  k file already e
dee0: 78 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68  xists.  All we h
def0: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
df00: 73 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74  s adjust our int
df10: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
df20: 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a  the lock level..
df30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
df40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
df50: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
df60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
df70: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21  eFileLock;.#if !
df80: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f  OS_VXWORKS.    /
df90: 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
dfa0: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
dfb0: 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
dfc0: 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63  .    utimes(zLoc
dfd0: 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
dfe0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
dff0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e000: 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
e010: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
e020: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f  .  fd = open(zLo
e030: 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c  ckFile,O_RDONLY|
e040: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30  O_CREAT|O_EXCL,0
e050: 36 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  600);.  if( fd<0
e060: 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65   ){.    /* faile
e070: 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65  d to open/create
e080: 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f   the file, someo
e090: 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65  ne else may have
e0a0: 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b   stolen the lock
e0b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
e0c0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e0d0: 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
e0e0: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
e0f0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
e100: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e110: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
e120: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
e130: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
e140: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
e150: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
e160: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
e170: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e180: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e1a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e1b0: 20 0a 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64   .  if( close(fd
e1c0: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
e1d0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
e1e0: 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
e1f0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
e200: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20    }.  .  /* got 
e210: 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
e220: 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
e230: 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
e240: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
e250: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e260: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
e270: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e280: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
e290: 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
e2a0: 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
e2b0: 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
e2c0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
e2d0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
e2e0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
e2f0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
e300: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
e310: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
e320: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
e330: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
e340: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
e350: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
e360: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
e370: 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
e380: 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
e390: 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
e3a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e3b0: 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
e3c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e3d0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
e3e0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e3f0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e400: 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
e410: 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
e420: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
e430: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
e440: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
e450: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
e460: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
e470: 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
e480: 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
e490: 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d  Lock,..   pFile-
e4a0: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
e4b0: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
e4c0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
e4d0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
e4e0: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
e4f0: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
e500: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
e510: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
e520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e530: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
e540: 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
e550: 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
e560: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
e570: 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
e580: 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
e590: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
e5a0: 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
e5b0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
e5c0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
e5d0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
e5e0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e5f0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
e600: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e610: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
e620: 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
e630: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
e640: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
e650: 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
e660: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
e670: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 75  _LOCK );.  if( u
e680: 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29  nlink(zLockFile)
e690: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
e6a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   0;.    int tErr
e6b0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
e6c0: 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
e6d0: 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
e6e0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e6f0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e700: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e710: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  R_UNLOCK);.    }
e720: 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
e730: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
e740: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
e750: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
e760: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e770: 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
e780: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
e790: 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
e7a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e7b0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
e7c0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
e7d0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
e7e0: 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
e7f0: 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
e800: 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
e810: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
e820: 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b  *id) {.  int rc;
e830: 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
e840: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
e850: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
e860: 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
e870: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
e880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
e890: 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
e8a0: 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
e8b0: 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
e8c0: 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74 75 72  ile(id);.  retur
e8d0: 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
e8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
e8f0: 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
e900: 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
e910: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
e920: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e970: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
e980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
e9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9e0: 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
e9f0: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
ea20: 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
ea30: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
ea40: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
ea50: 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
ea60: 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
ea70: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
ea80: 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
ea90: 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
eaa0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
eab0: 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
eac0: 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
ead0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
eae0: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
eaf0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
eb00: 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
eb10: 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
eb20: 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
eb30: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
eb40: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
eb50: 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
eb60: 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
eb70: 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
eb80: 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
eb90: 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
eba0: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
ebb0: 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
ebc0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
ebd0: 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
ebe0: 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
ebf0: 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
ec00: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
ec10: 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
ec20: 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  f or if.** compi
ec30: 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53  ling for VXWORKS
ec40: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
ec50: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
ec60: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
ec70: 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  RKS../*.** Retry
ec80: 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
ec90: 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
eca0: 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
ecb0: 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
ecc0: 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
ecd0: 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
ece0: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
ecf0: 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
ed00: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
ed10: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
ed20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ed30: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
ed40: 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
ed50: 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
ed60: 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
ed70: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
ed80: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
ed90: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
eda0: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
edb0: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
edc0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
edd0: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
ede0: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
edf0: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
ee00: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
ee10: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
ee20: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
ee30: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
ee40: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
ee50: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
ee60: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
ee70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ee80: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
ee90: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
eea0: 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
eeb0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
eec0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
eed0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
eee0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
eef0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
ef00: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
ef10: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ef20: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
ef30: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
ef40: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ef50: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
ef60: 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
ef70: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
ef80: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
ef90: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
efa0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
efb0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
efc0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
efd0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
efe0: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
eff0: 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
f000: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
f010: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
f020: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
f030: 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
f040: 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
f050: 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
f060: 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
f070: 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
f080: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
f090: 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
f0a0: 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
f0b0: 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
f0c0: 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
f0d0: 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
f0e0: 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
f0f0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
f100: 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
f110: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
f120: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f130: 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
f140: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
f150: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
f160: 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
f170: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
f180: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
f190: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a  IOERR_UNLOCK); .
f1a0: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
f1b0: 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
f1c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
f1d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
f1e0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
f1f0: 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
f200: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f210: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
f220: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
f230: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76  no;.      reserv
f240: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  ed = 1;.      /*
f250: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69   someone else mi
f260: 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65  ght have it rese
f270: 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72  rved */.      lr
f280: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
f290: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f2a0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f2b0: 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  RR_LOCK); .     
f2c0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
f2d0: 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
f2e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
f2f0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
f300: 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
f310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f320: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
f330: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
f340: 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
f350: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
f360: 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
f370: 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
f380: 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
f390: 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
f3a0: 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
f3b0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
f3c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
f3d0: 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d  K;.    reserved=
f3e0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  1;.  }.#endif /*
f3f0: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
f400: 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
f410: 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d   */.  *pResOut =
f420: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
f430: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f440: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
f450: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
f460: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
f470: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
f480: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
f490: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
f4a0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
f4b0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
f4c0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
f4d0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
f4e0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
f4f0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
f500: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
f510: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
f520: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
f530: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
f540: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
f550: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
f560: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
f570: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
f580: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
f590: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
f5a0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
f5b0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
f5c0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
f5d0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
f5e0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
f5f0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
f600: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
f610: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
f620: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
f630: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
f640: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
f650: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
f660: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
f670: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
f680: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
f690: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
f6a0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
f6b0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
f6c0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
f6d0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
f6e0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f6f0: 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79  .** flock() only
f700: 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
f710: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
f720: 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
f730: 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
f740: 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
f750: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
f760: 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
f770: 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
f780: 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
f790: 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
f7a0: 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
f7b0: 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
f7c0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
f7d0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
f7e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
f7f0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
f800: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
f810: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
f820: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
f830: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
f840: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
f850: 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b  ic int flockLock
f860: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f870: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
f880: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f890: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
f8a0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f8b0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
f8c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
f8d0: 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
f8e0: 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
f8f0: 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
f900: 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
f910: 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
f920: 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
f930: 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
f940: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
f950: 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
f960: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f970: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
f980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f990: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
f9a0: 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
f9b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
f9c0: 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70   (robust_flock(p
f9d0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
f9e0: 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
f9f0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fa00: 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
fa10: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
fa20: 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
fa30: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fa40: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fa50: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fa60: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
fa70: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
fa80: 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
fa90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
faa0: 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  Errno;.    }.  }
fab0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67   else {.    /* g
fac0: 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
fad0: 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
fae0: 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  k */.    pFile->
faf0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
fb00: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54  eLock;.  }.  OST
fb10: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
fb20: 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c  d %s %s (flock)\
fb30: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
fb40: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
fb50: 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ck), .          
fb60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
fb70: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
fb80: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
fb90: 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
fba0: 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
fbb0: 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
fbc0: 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
fbd0: 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
fbe0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
fbf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fc00: 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
fc10: 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
fc20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
fc30: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
fc40: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
fc50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
fc60: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
fc70: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
fc80: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
fc90: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
fca0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
fcb0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
fcc0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
fcd0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
fce0: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
fcf0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
fd00: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
fd10: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
fd20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
fd30: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
fd40: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
fd50: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
fd60: 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
fd70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fd80: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
fd90: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fda0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fdb0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
fdc0: 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b  %d pid=%d (flock
fdd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
fde0: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
fdf0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
fe00: 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
fe10: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
fe20: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
fe30: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
fe40: 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
fe50: 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
fe60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
fe70: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
fe80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe90: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
fea0: 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
feb0: 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
fec0: 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
fed0: 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
fee0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fef0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
ff00: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
ff10: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
ff20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ff30: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
ff40: 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
ff50: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
ff60: 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
ff70: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
ff80: 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20  .  if (rc) {.   
ff90: 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d   int r, tErrno =
ffa0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20   errno;.    r = 
ffb0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ffc0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
ffd0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
ffe0: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
fff0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29  IS_LOCK_ERROR(r)
10000 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10010 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
10020 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  rno;.    }.#ifde
10030 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
10040 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
10050 53 0a 20 20 20 20 69 66 28 20 28 72 20 26 20 53  S.    if( (r & S
10060 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
10070 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
10080 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49 54 45        r = SQLITE
10090 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BUSY;.    }.#en
100a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
100b0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
100c0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20  ERRORS */.    . 
100d0 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d     return r;.  }
100e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
100f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
10100 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
10110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
10130 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
10140 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
10150 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10160 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
10170 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63  {.    flockUnloc
10180 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
10190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f    }.  return clo
101a0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
101b0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
101c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
101d0 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f  NG_STYLE && !OS_
101e0 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  VXWORK */../****
101f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10200 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b  End of the flock
10210 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
10220 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
10230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64  **** Begin Named
10300 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69   Semaphore Locki
10310 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
10330 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
10340 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  e locking is onl
10350 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56  y supported on V
10360 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  xWorks..**.** Se
10370 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
10380 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b  is like dot-lock
10390 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68   and flock in th
103a0 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c  at it really onl
103b0 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58  y.** supports EX
103c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e  CLUSIVE locking.
103d0 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
103e0 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64  process can read
103f0 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65   or write.** the
10400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
10410 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
10420 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61  reduces potentia
10430 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62  l concurrency, b
10440 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  ut.** makes the 
10450 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
10460 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e  ion much easier.
10470 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  .*/.#if OS_VXWOR
10480 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  KS../*.** This r
10490 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
104a0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
104b0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
104c0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
104d0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
104e0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
104f0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
10500 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
10510 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
10520 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
10530 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
10540 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
10550 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
10560 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
10570 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
10580 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
10590 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
105a0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
105b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
105c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
105d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
105e0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
105f0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
10600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
10610 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
10620 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10630 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10640 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
10650 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10660 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10670 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10680 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10690 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
106a0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
106b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
106c0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
106d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
106e0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
106f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
10700 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
10710 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
10720 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
10730 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
10740 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
10750 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
10760 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
10770 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
10780 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
10790 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69   statBuf;..    i
107a0 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
107b0 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
107c0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
107d0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
107e0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
107f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10800 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10810 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10820 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10830 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
10840 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  K);.        pFil
10850 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10860 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65  Errno;.      } e
10870 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
10880 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
10890 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
108a0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
108b0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
108c0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
108d0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
108e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
108f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10900 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
10910 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
10920 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
10930 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
10940 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
10950 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
10960 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
10970 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
10980 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
10990 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
109a0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
109b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
109c0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
109d0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
109e0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
109f0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
10a00 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
10a10 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
10a20 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
10a30 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
10a40 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
10a50 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
10a60 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
10a70 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
10a80 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
10a90 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
10aa0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
10ab0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
10ac0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
10ad0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
10ae0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
10af0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
10b00 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
10b10 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
10b20 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
10b30 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
10b40 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
10b50 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
10b60 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
10b70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
10b80 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
10b90 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
10ba0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
10bb0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
10bc0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
10bd0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
10be0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
10bf0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
10c00 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
10c10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
10c20 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
10c30 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
10c40 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10c50 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
10c60 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
10c70 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
10c80 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
10c90 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
10ca0 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
10cb0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
10cc0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
10cd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
10ce0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
10cf0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
10d00 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
10d10 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
10d20 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
10d30 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
10d40 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
10d50 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
10d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10d70 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
10d80 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
10d90 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10da0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10db0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10dc0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
10dd0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63  tatic int semLoc
10de0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10df0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10e00 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
10e10 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10e20 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
10e30 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
10e40 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
10e50 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20  >pSem;.  int rc 
10e60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10e70 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
10e80 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
10e90 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10ea0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10eb0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10ec0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10ed0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10ee0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
10ef0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10f00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10f10 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20  ileLock;.    rc 
10f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10f30 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10f40 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
10f50 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e  lock semaphore n
10f60 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20  ow but bail out 
10f70 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63  when already loc
10f80 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ked. */.  if( se
10f90 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
10fa0 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =-1 ){.    rc = 
10fb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10fc0 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f   goto sem_end_lo
10fd0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f  ck;.  }..  /* go
10fe0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10ff0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
11000 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
11010 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
11020 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f  ck;.. sem_end_lo
11030 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck:.  return rc;
11040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
11050 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11060 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
11070 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
11080 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
11090 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
110a0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
110b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
110c0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
110d0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
110e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
110f0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
11100 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
11110 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
11120 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
11130 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
11140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
11150 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
11160 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11170 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11180 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11190 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
111a0 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
111b0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
111c0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  m;..  assert( pF
111d0 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ile );.  assert(
111e0 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41   pSem );.  OSTRA
111f0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
11200 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11210 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
11220 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11230 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  .   pFile->eFile
11240 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29  Lock, getpid()))
11250 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
11260 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
11270 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
11280 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
11290 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
112a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
112b0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
112c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
112d0 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
112e0 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
112f0 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
11300 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
11310 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46  sive */.  if (eF
11320 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
11330 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
11340 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11350 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
11360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11370 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
11380 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a  really unlock. *
11390 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73  /.  if ( sem_pos
113a0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a  t(pSem)==-1 ) {.
113b0 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72      int rc, tErr
113c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
113d0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
113e0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
113f0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11400 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
11410 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11420 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11430 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11440 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
11450 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
11460 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
11470 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11480 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
11490 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
114a0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
114b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
114c0 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  mClose(sqlite3_f
114d0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28  ile *id) {.  if(
114e0 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46   id ){.    unixF
114f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11500 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
11510 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  semUnlock(id, NO
11520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65  _LOCK);.    asse
11530 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20  rt( pFile );.   
11540 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
11550 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e  );.    releaseIn
11560 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
11570 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
11580 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55  ex();.    closeU
11590 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
115a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
115b0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
115c0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
115d0 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  /*.** Named sema
115e0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
115f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
11600 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
11620 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  nd of the named 
11630 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69  semaphore lock i
11640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
116b0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
116c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
116f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11700 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
11720 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a  in AFP Locking *
11730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68  .**.** AFP is th
11760 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50  e Apple Filing P
11770 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73  rotocol.  AFP is
11780 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73   a network files
11790 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f  ystem found.** o
117a0 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73  n Apple Macintos
117b0 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f  h computers - bo
117c0 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a  th OS9 and OSX..
117d0 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74  **.** Third-part
117e0 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  y implementation
117f0 73 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61  s of AFP are ava
11800 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69  ilable.  But thi
11810 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f  s code here.** o
11820 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58  nly works on OSX
11830 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
11840 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
11850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11860 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a  CKING_STYLE./*.*
11870 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
11880 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
11890 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
118a0 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
118b0 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65   state.*/.typede
118c0 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
118d0 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
118e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
118f0 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
11900 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72  ontext {.  int r
11910 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74  eserved;.  const
11920 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
11930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
11940 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
11950 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ile */.};..struc
11960 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
11970 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  B2.{.  unsigned 
11980 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
11990 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73  ;        /* offs
119a0 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
119b0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
119c0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
119d0 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
119e0 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20  /* nbr of bytes 
119f0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
11a00 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
11a10 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f  retRangeStart; /
11a20 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74  * nbr of 1st byt
11a30 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63  e locked if succ
11a40 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69  essful */.  unsi
11a50 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b  gned char unLock
11a60 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Flag;         /*
11a70 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d   1 = unlock, 0 =
11a80 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
11a90 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e  ned char startEn
11aa0 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  dFlag;       /* 
11ab0 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20  1=rel to end of 
11ac0 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73  fork, 0=rel to s
11ad0 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64  tart */.  int fd
11ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
11b00 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f  ile desc to asso
11b10 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68  c this lock with
11b20 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
11b30 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
11b40 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20  ck2FSCTL        
11b50 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
11b60 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
11b70 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54  ockPB2)../*.** T
11b80 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
11b90 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20   for setting or 
11ba0 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72  clearing a bit-r
11bb0 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a  ange lock on an.
11bc0 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  ** AFP filesyste
11bd0 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  m..** .** Return
11be0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
11bf0 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55  ccess, SQLITE_BU
11c00 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  SY on failure..*
11c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
11c20 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74  SetLock(.  const
11c30 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
11c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
11c50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
11c60 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e   be locked or un
11c70 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
11c80 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
11c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
11ca0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
11cb0 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20  or on path */.  
11cc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
11cd0 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f  ng offset,     /
11ce0 2a 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20  * First byte to 
11cf0 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
11d00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
11d10 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a  g length,     /*
11d20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11d30 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
11d40 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20  t setLockFlag   
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d60 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b  True to set lock
11d70 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61  .  False to clea
11d80 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  r lock */.){.  s
11d90 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
11da0 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74  ockPB2 pb;.  int
11db0 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e   err;.  .  pb.un
11dc0 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f  LockFlag = setLo
11dd0 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a  ckFlag ? 0 : 1;.
11de0 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61    pb.startEndFla
11df0 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73  g = 0;.  pb.offs
11e00 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70  et = offset;.  p
11e10 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  b.length = lengt
11e20 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46  h; .  pb.fd = pF
11e30 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54  ile->h;.  .  OST
11e40 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
11e50 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20  K [%s] for %d%s 
11e60 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c  in range %llx:%l
11e70 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74  lx\n", .    (set
11e80 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f  LockFlag?"ON":"O
11e90 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  FF"), pFile->h, 
11ea0 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73  (pb.fd==-1?"[tes
11eb0 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20  tval-1]":""),.  
11ec0 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68    offset, length
11ed0 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74  ));.  err = fsct
11ee0 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74  l(path, afpfsByt
11ef0 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
11f00 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20  , &pb, 0);.  if 
11f10 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20  ( err==-1 ) {.  
11f20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
11f30 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
11f40 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
11f50 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65  AFPSETLOCK faile
11f60 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73  d to fsctl() '%s
11f70 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ' %d %s\n",.    
11f80 20 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74           path, t
11f90 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28  Errno, strerror(
11fa0 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65  tErrno)));.#ifde
11fb0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
11fc0 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  AFP_LOCK_ERRORS.
11fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11fe0 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20  BUSY;.#else.    
11ff0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12000 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12010 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
12020 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
12030 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f  ckFlag ? SQLITE_
12040 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c  IOERR_LOCK : SQL
12050 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12060 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
12070 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
12080 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12090 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
120a0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
120b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
120c0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
120d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
120e0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
120f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12100 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
12110 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12120 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12130 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12140 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12150 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12160 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12170 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12180 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12190 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
121a0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
121b0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
121c0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
121d0 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
121e0 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
121f0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12200 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12210 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12220 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12230 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12240 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76  t afpCheckReserv
12250 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
12260 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
12270 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
12280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12290 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
122a0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
122b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
122c0 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  )id;.  .  Simula
122d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
122e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
122f0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12300 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12310 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 66 70  ( pFile );.  afp
12320 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
12330 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
12340 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
12350 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12360 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e  ntext;.  if( con
12370 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
12380 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d  {.    *pResOut =
12390 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
123a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
123b0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
123c0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
123d0 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
123e0 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
123f0 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43  ads */.  .  /* C
12400 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
12410 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
12420 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
12430 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
12440 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
12450 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
12460 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
12470 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
12480 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
12490 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
124a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
124b0 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73     */.  if( !res
124c0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
124d0 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45  lock the RESERVE
124e0 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  D byte */.    in
124f0 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f  t lrc = afpSetLo
12500 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
12510 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
12520 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
12530 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45   .    if( SQLITE
12540 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20  _OK==lrc ){.    
12550 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65    /* if we succe
12560 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74  eded in taking t
12570 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
12580 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72  , unlock it to r
12590 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  estore.      ** 
125a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  the original sta
125b0 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  te */.      lrc 
125c0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
125d0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
125e0 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
125f0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
12600 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
12610 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f   if we failed to
12620 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68   get the lock th
12630 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  en someone else 
12640 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a  must have it */.
12650 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12660 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
12670 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12680 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63  lrc) ){.      rc
12690 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =lrc;.    }.  }.
126a0 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
126b0 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
126c0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
126d0 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e  %d %d %d (afp)\n
126e0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
126f0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a   reserved));.  .
12700 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12710 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12730 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12740 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12750 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12760 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12770 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12780 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12790 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
127a0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
127b0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
127c0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
127d0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
127e0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
127f0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12800 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12810 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12820 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12830 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12840 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12850 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12860 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12870 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12880 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12890 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
128a0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
128b0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
128c0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
128d0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
128e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
128f0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12900 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12910 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12920 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12930 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12940 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12950 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12960 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12970 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
12980 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12990 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
129a0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
129b0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
129c0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
129d0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
129e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
129f0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
12a00 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
12a10 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
12a20 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
12a30 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
12a40 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
12a50 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71  c int afpLock(sq
12a60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12a70 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
12a80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12a90 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
12aa0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12ab0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
12ac0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
12ad0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
12ae0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
12af0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
12b00 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
12b10 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
12b20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
12b30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12b40 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
12b50 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
12b60 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
12b70 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
12b80 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
12b90 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
12ba0 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c  leLock), azFileL
12bb0 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ock(pFile->eFile
12bc0 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
12bd0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e    azFileLock(pIn
12be0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ode->eFileLock),
12bf0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
12c00 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a   , getpid()));..
12c10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
12c20 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
12c30 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
12c40 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
12c50 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
12c60 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
12c70 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
12c80 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
12c90 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
12ca0 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
12cb0 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
12cc0 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
12cd0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
12ce0 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
12cf0 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
12d00 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
12d10 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
12d20 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
12d30 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
12d40 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
12d50 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
12d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
12d80 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
12d90 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
12da0 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
12db0 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
12dc0 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
12dd0 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
12de0 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
12df0 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
12e00 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
12e10 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
12e20 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
12e30 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
12e40 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
12e50 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
12e60 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
12e70 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
12e80 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
12e90 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
12ea0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12eb0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12ec0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
12ed0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
12ee0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
12ef0 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
12f00 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
12f10 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
12f20 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
12f30 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
12f40 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
12f50 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
12f60 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
12f70 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
12f80 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
12f90 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
12fa0 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
12fb0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
12fc0 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
12fd0 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
12fe0 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
12ff0 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
13000 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
13010 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
13020 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
13030 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
13040 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
13050 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
13060 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
13070 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
13080 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
13090 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
130a0 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
130b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
130c0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
130d0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
130e0 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
130f0 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
13100 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
13110 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
13120 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
13130 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
13140 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
13150 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
13160 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
13170 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
13180 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
13190 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
131a0 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
131b0 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
131c0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
131d0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
131e0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
131f0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
13200 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
13210 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13220 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
13230 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
13240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
13250 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
13260 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
13270 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
13280 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
13290 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
132a0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
132b0 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
132c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
132d0 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
132e0 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
132f0 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
13300 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
13310 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
13320 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
13330 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
13340 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
13350 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
13360 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
13370 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
13380 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
13390 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
133a0 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
133b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
133c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
133d0 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
133e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
133f0 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
13400 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13410 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13420 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
13430 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
13440 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
13450 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
13460 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
13470 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
13480 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
13490 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
134a0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
134b0 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
134c0 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
134d0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
134e0 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
134f0 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
13500 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
13510 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
13520 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
13530 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  rc2, lrc1Errno;.
13540 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73      long lk, mas
13550 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65  k;.    .    asse
13560 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
13570 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
13580 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
13590 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
135a0 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20        .    mask 
135b0 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d  = (sizeof(long)=
135c0 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e  =8) ? LARGEST_IN
135d0 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66  T64 : 0x7fffffff
135e0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ;.    /* Now get
135f0 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
13600 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
13610 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
13620 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
13630 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
13640 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
13650 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
13660 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
13670 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
13680 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b  yte = (lk & mask
13690 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
136a0 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20   1);.    lrc1 = 
136b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
136c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
136d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
136e0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
136f0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
13700 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
13710 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
13720 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
13730 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
13740 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
13750 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
13760 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
13770 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
13780 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
13790 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
137a0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
137b0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
137c0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
137d0 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
137e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
137f0 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72  stErrno = lrc1Er
13800 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
13810 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc1;.      goto
13820 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
13830 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53     } else if( IS
13840 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32  _LOCK_ERROR(lrc2
13850 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
13860 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f  lrc2;.      goto
13870 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
13880 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72     } else if( lr
13890 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  c1 != SQLITE_OK 
138a0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  ) {.      rc = l
138b0 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rc1;.    } else 
138c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
138d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
138e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
138f0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
13900 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
13910 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
13920 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
13930 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
13940 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
13950 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
13960 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
13970 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
13980 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
13990 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
139a0 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65  his.     ** same
139b0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
139c0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
139d0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
139e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
139f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13a00 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
13a10 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
13a20 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
13a30 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
13a40 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
13a50 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
13a60 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13a70 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
13a80 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
13a90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
13aa0 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ed = 0;.    asse
13ab0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
13ac0 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ileLock );.    i
13ad0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20  f (eFileLock >= 
13ae0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
13af0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13b00 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  k < RESERVED_LOC
13b10 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
13b20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
13b30 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
13b40 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
13b50 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
13b60 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
13b70 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
13b80 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66  1);.      if( !f
13b90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
13ba0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
13bb0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
13bc0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
13bd0 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f  ailed && eFileLo
13be0 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f  ck == EXCLUSIVE_
13bf0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a  LOCK) {.      /*
13c00 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
13c10 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20  USIVE lock */.  
13c20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
13c30 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65  Remove the share
13c40 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72  d lock before tr
13c50 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20  ying the range. 
13c60 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a   we'll need to .
13c70 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62        ** reestab
13c80 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
13c90 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74  lock if we can't
13ca0 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c   get the  afpUnl
13cb0 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ock.      */.   
13cc0 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64 20     if( !(failed 
13cd0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
13ce0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
13cf0 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
13d00 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  T +.            
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
13d20 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
13d30 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20   1, 0)) ){.     
13d40 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d     int failed2 =
13d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13d60 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
13d70 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
13d80 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
13d90 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
13da0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
13db0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
13dc0 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
13dd0 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20  D_FIRST, .      
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
13e00 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20  SIZE, 1);.      
13e10 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20    if( failed && 
13e20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65  (failed2 = afpSe
13e30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
13e40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
13e70 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61  ST + pInode->sha
13e80 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
13e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13ea0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
13eb0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
13ec0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
13ed0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
13ee0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
13ef0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
13f00 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
13f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
13f20 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
13f30 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
13f40 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
13f50 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
13f60 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
13f70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
13f80 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
13f90 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
13fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13fb0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
13fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13fd0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
13fe0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
13ff0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
14000 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
14020 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14030 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
14040 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
14050 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
14060 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
14070 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
14080 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
14090 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
140a0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
140b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
140c0 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
140d0 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
140e0 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
140f0 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
14100 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
14110 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c   %s %s (afp)\n",
14120 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
14130 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
14140 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
14150 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
14160 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
14170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14180 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
14190 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
141a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
141b0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
141c0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
141d0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
141e0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
141f0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
14200 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
14210 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
14220 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
14230 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
14240 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
14250 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
14260 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
14270 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14280 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
14290 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
142a0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
142b0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
142c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
142d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
142e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
142f0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
14300 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
14310 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
14320 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
14330 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
14340 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
14350 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
14360 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
14370 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
14380 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
14390 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
143a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
143b0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
143c0 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
143d0 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
143e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
143f0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
14400 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
14410 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
14420 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
14430 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
14440 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  nShared,.       
14450 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
14460 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14470 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14480 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
14490 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
144a0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
144b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
144c0 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
144d0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
144e0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
144f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
14500 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
14510 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
14520 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
14530 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
14540 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
14550 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
14560 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
14570 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
14580 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
14590 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
145a0 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
145b0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
145c0 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e 64 65  (0);.    .#ifnde
145d0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
145e0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
145f0 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
14600 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
14610 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
14620 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
14630 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
14640 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
14650 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
14660 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
14670 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
14680 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
14690 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
146a0 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
146b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
146c0 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
146d0 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
146e0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
146f0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
14700 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
14710 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
14720 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
14730 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
14740 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
14750 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
14760 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
14770 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
14780 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
14790 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
147a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
147b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
147c0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30  inNormalWrite==0
147d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
147e0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d  File->dbUpdate==
147f0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
14800 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
14810 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Chng==1 );.    p
14820 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
14830 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
14840 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69      .    if( pFi
14850 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  le->eFileLock==E
14860 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
14870 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
14880 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
14890 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
148a0 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
148b0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
148c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
148d0 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
148e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
148f0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
14900 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  red>1) ){.      
14910 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74    /* only re-est
14920 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
14930 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73  d lock if necess
14940 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ary */.        i
14950 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  nt sharedLockByt
14960 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
14970 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
14980 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
14990 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
149a0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
149b0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
149c0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
149d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
149e0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
149f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14a00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14a10 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
14a20 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
14a30 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ING_LOCK ){.    
14a40 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
14a50 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14a60 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14a70 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
14a80 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63     } .    if( rc
14a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
14aa0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
14ab0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
14ac0 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  & context->reser
14ad0 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ved ){.      rc 
14ae0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
14af0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
14b00 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
14b10 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 1, 0);.     
14b20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20   if( !rc ){ .   
14b30 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
14b40 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20  served = 0; .   
14b50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14b60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14b70 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
14b80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
14b90 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
14ba0 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  )){.      pInode
14bb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
14bc0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
14bd0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
14be0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c  QLITE_OK && eFil
14bf0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
14c00 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  {..    /* Decrem
14c10 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c  ent the shared l
14c20 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65  ock counter.  Re
14c30 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75  lease the lock u
14c40 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f  sing an.    ** O
14c50 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e  S call only when
14c60 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20   all threads in 
14c70 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73  this same proces
14c80 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a  s have released.
14c90 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e      ** the lock.
14ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69  .    */.    unsi
14cb0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
14cc0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
14cd0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
14ce0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
14cf0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
14d00 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
14d10 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
14d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75  =0 ){.      Simu
14d30 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
14d40 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  n(1);.      Simu
14d50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
14d60 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75  -1) ).      Simu
14d70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
14d80 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
14d90 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20  !skipShared ){. 
14da0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
14db0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
14dc0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
14dd0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
14de0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14df0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
14e00 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
14e10 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
14e20 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
14e30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14e40 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
14e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14e70 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
14e80 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65  ck--;.      asse
14e90 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
14ea0 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  k>=0 );.      if
14eb0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
14ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
14ed0 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46   = closePendingF
14ee0 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
14ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
14f00 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
14f10 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
14f20 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
14f30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14f40 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
14f50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
14f60 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
14f70 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
14f80 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
14f90 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
14fa0 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
14fb0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
14fc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14fd0 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  OK;.  if( id ){.
14fe0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
14ff0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15000 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f  )id;.    afpUnlo
15010 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
15020 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
15030 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70  tex();.    if( p
15040 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
15050 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
15060 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
15070 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
15080 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
15090 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
150a0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
150b0 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65  just.      ** ye
150c0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
150d0 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
150e0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
150f0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
15100 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
15110 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50  or to pInode->aP
15120 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
15130 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
15140 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
15150 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
15160 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
15170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15180 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
15190 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  le);.    }.    r
151a0 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
151b0 70 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  pFile);.    sqli
151c0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
151d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
151e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
151f0 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
15200 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
15210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15220 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
15230 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
15240 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
15250 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
15260 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
15270 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
15280 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
15290 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
152a0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
152b0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
152c0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
152d0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
152e0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
152f0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
15300 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
15310 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
15320 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
15330 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
15340 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
15350 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15370 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
15380 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
15390 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
153a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
153b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
15400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
15450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15460 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
15470 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
15480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
154a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
154b0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
154c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
154d0 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
154e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
154f0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
15500 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
15510 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
15520 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
15530 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
15540 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
15550 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
15560 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
15570 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
15580 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
15590 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
155a0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
155b0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
155c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
155d0 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
155e0 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
155f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15600 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
15610 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e   return _posixUn
15620 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
15630 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
15640 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
15650 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
15660 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
15670 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
15680 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
15690 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
156a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
156b0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
156c0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
156d0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
156e0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
156f0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
15700 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
15710 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
15720 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15730 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
15740 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
15750 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15770 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157c0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15810 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15820 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
15830 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
15840 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15860 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
15870 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
15880 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
15890 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
158a0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
158b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
158c0 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
158d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
158e0 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
158f0 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
15900 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
15910 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
15920 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
15930 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
15940 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
15950 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
15960 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
15970 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
15980 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
15990 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
159a0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
159b0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
159c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
159d0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
159e0 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
159f0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
15a00 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
15a10 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
15a20 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
15a30 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
15a40 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
15a50 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
15a60 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
15a70 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
15a80 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
15a90 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
15aa0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
15ab0 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
15ac0 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
15ad0 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
15ae0 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
15af0 5f 50 52 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e  _PREAD.** any an
15b00 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
15b10 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
15b20 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
15b30 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
15b40 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
15b50 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
15b60 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
15b70 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
15b80 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
15b90 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
15ba0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
15bb0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
15bc0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
15bd0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
15be0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
15bf0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15c00 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
15c10 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
15c20 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
15c30 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
15c40 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
15c50 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
15c60 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
15c70 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
15c80 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
15c90 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 67  E_PREAD).  do{ g
15ca0 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
15cb0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
15cc0 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  set); }while( go
15cd0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
15ce0 4e 54 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  NTR );.  Simulat
15cf0 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
15d00 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
15d10 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
15d20 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 70 72 65  .  do{ got = pre
15d30 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
15d40 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
15d50 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
15d60 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
15d70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15d80 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
15d90 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65  #else.  newOffse
15da0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
15db0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
15dc0 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  T);.  SimulateIO
15dd0 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
15de0 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  -- );.  if( newO
15df0 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
15e00 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
15e10 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
15e20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
15e30 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
15e40 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
15e50 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
15e60 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
15e70 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
15e80 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15e90 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 72   }.  do{ got = r
15ea0 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
15eb0 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20 67   cnt); }while( g
15ec0 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
15ed0 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 20  INTR );.#endif. 
15ee0 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66   TIMER_END;.  if
15ef0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28  ( got<0 ){.    (
15f00 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
15f10 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
15f20 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  o;.  }.  OSTRACE
15f30 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  (("READ    %-3d 
15f40 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
15f50 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f  ", id->h, got, o
15f60 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
15f70 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
15f80 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   got;.}../*.** R
15f90 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
15fa0 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
15fb0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
15fc0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
15fd0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
15fe0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
15ff0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
16000 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
16010 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
16020 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
16030 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16040 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
16050 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
16060 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16070 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
16080 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
16090 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
160a0 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
160b0 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49  t( id );..  /* I
160c0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
160d0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
160e0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
160f0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
16100 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
16110 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
16120 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
16130 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
16140 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
16150 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
16160 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
16170 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
16180 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
16190 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
161a0 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
161b0 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
161c0 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
161d0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
161e0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
161f0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
16200 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
16210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16220 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
16230 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
16240 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
16250 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
16260 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16270 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
16280 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
16290 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74  rrno = 0; /* not
162a0 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
162b0 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
162c0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
162d0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
162e0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
162f0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
16300 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
16310 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
16320 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16330 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
16340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
16350 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
16360 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20  id->offset then 
16370 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69  read cnt bytes i
16380 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74  nto pBuf..** Ret
16390 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
163a0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
163b0 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74   read.  Update t
163c0 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  he offset..**.**
163d0 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
163e0 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
163f0 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77  ue on a failed w
16400 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72 72  rite the lastErr
16410 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
16420 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
16430 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
16440 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28  nt seekAndWrite(
16450 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36  unixFile *id, i6
16460 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20  4 offset, const 
16470 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
16480 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
16490 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
164a0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
164b0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
164c0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
164d0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
164e0 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
164f0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
16500 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 70 77  ).  do{ got = pw
16510 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66  rite(id->h, pBuf
16520 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
16530 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
16540 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
16550 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
16560 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
16570 7b 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36 34  { got = pwrite64
16580 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
16590 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
165a0 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
165b0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
165c0 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
165d0 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
165e0 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
165f0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
16600 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
16610 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
16620 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
16630 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
16640 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
16650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16660 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
16670 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
16680 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
16690 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
166a0 64 6f 7b 20 67 6f 74 20 3d 20 77 72 69 74 65 28  do{ got = write(
166b0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
166c0 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
166d0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
166e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d   );.#endif.  TIM
166f0 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f  ER_END;.  if( go
16700 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69  t<0 ){.    ((uni
16710 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
16720 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
16730 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
16740 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64  WRITE   %-3d %5d
16750 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
16760 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
16770 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
16780 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
16790 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  t;.}.../*.** Wri
167a0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
167b0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
167c0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
167d0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
167e0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
167f0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
16800 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
16810 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
16820 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16830 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
16840 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
16850 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
16860 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
16870 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
16880 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
16890 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
168a0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
168b0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
168c0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
168d0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
168e0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
168f0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
16900 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
16910 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
16920 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
16930 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
16940 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
16950 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
16960 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
16970 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
16980 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
16990 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
169a0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
169b0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
169c0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
169d0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
169e0 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
169f0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
16a00 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
16a10 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
16a20 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
16a30 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
16a40 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
16a50 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
16a60 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
16a70 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
16a80 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
16a90 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
16aa0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
16ab0 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
16ac0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
16ad0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
16ae0 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
16af0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
16b00 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
16b10 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
16b20 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
16b30 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
16b40 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
16b50 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
16b60 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
16b70 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
16b80 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
16b90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
16ba0 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
16bb0 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
16bc0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16bd0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
16be0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
16bf0 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
16c00 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
16c10 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16c20 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
16c30 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
16c40 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
16c50 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
16c60 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
16c70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
16c80 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
16c90 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
16ca0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
16cb0 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
16cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
16cd0 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
16ce0 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
16cf0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
16d00 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
16d10 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
16d20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
16d30 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
16d40 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
16d50 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
16d60 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
16d70 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
16d80 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
16d90 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
16da0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
16db0 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
16dc0 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
16dd0 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
16de0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
16df0 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
16e00 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
16e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16e20 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
16e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16e50 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
16e60 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
16e70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16e80 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
16e90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
16ea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
16eb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
16ec0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
16ed0 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
16ee0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
16ef0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
16f00 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
16f10 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
16f20 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
16f30 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
16f40 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
16f50 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16f60 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16f70 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16f80 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16f90 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
16fa0 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
16fb0 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
16fc0 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
16fd0 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
16fe0 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
16ff0 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
17000 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
17010 6c 6f 77 65 72 29 20 66 73 79 6e 63 28 29 2e 0a  lower) fsync()..
17020 2a 2a 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ** If you know t
17030 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
17040 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
17050 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
17060 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
17070 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
17080 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
17090 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
170a0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
170b0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6c   && !defined(__l
170c0 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66 69 6e 65  inux__).# define
170d0 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
170e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
170f0 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
17100 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64  SYNC to 0 or 1 d
17110 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
17120 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
17130 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61  e F_FULLFSYNC ma
17140 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20  cro is defined. 
17150 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20   F_FULLFSYNC is 
17160 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c  currently.** onl
17170 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
17180 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68  ac OS X.  But th
17190 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e  at could change.
171a0 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c  .*/.#ifdef F_FUL
171b0 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  LFSYNC.# define 
171c0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31  HAVE_FULLFSYNC 1
171d0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
171e0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30  HAVE_FULLFSYNC 0
171f0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
17200 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
17210 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
17220 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
17230 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
17240 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
17250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
17260 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
17270 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
17280 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
17290 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
172a0 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
172b0 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
172c0 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
172d0 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
172e0 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
172f0 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
17300 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
17310 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
17320 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
17330 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
17340 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
17350 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
17360 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
17370 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
17380 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
17390 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
173a0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
173b0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
173c0 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
173d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
173e0 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74  ite sets the dat
173f0 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68  aOnly flag if th
17400 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
17410 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  le is unchanged.
17420 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68  .** The idea beh
17430 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20  ind dataOnly is 
17440 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f  that it should o
17450 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69  nly write the fi
17460 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f  le content.** to
17470 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69   disk, not the i
17480 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73  node.  We only s
17490 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74  et dataOnly if t
174a0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
174b0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69  .** unchanged si
174c0 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  nce the file siz
174d0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
174e0 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72   inode.  However
174f0 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74  , .** Ted Ts'o t
17500 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61  ells us that fda
17510 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c  tasync() will al
17520 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f  so write the ino
17530 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c  de if the.** fil
17540 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67  e size has chang
17550 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ed.  The only re
17560 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  al difference be
17570 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28  tween fdatasync(
17580 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29  ).** and fsync()
17590 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20  , Ted tells us, 
175a0 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  is that fdatasyn
175b0 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75  c() will not flu
175c0 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20  sh the.** inode 
175d0 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20  if the mtime or 
175e0 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69  owner or other i
175f0 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20  node attributes 
17600 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  have changed..**
17610 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62   We only care ab
17620 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  out the file siz
17630 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72  e, not the other
17640 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73   file attributes
17650 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61  , so.** as far a
17660 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63  s SQLite is conc
17670 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73  erned, an fdatas
17680 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20  ync() is always 
17690 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c  adequate..** So,
176a0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
176b0 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74  datasync() if it
176c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
176d0 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20  egardless of.** 
176e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
176f0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a   dataOnly flag..
17700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
17710 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
17720 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
17730 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
17740 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
17750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64  e following "ifd
17760 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62  ef/elif/else/" b
17770 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d  lock has the sam
17780 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20  e structure as. 
17790 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f   ** the one belo
177a0 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61  w. It is replica
177b0 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20  ted here solely 
177c0 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72  to avoid clutter
177d0 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ing .  ** up the
177e0 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20   real code with 
177f0 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  the UNUSED_PARAM
17800 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20  ETER() macros.. 
17810 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17820 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53  E_NO_SYNC.  UNUS
17830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
17840 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17850 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
17860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17870 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
17880 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
17890 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
178a0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
178b0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
178c0 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
178d0 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
178e0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
178f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
17900 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
17910 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
17920 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
17930 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
17940 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
17950 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
17960 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
17970 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
17980 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
17990 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
179a0 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
179b0 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
179c0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
179d0 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
179e0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
179f0 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
17a00 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
17a10 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
17a20 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
17a30 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
17a40 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
17a50 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
17a60 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
17a70 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
17a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17a90 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
17aa0 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
17ab0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
17ac0 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
17ad0 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
17ae0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
17af0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
17b00 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
17b10 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
17b20 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
17b30 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
17b40 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
17b50 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
17b60 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
17b70 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
17b80 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
17b90 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
17ba0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
17bb0 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
17bc0 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
17bd0 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
17be0 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
17bf0 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
17c00 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
17c10 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
17c20 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
17c30 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
17c40 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
17c50 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
17c60 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
17c70 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
17c80 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
17c90 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
17ca0 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
17cb0 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
17cc0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
17cd0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
17ce0 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
17cf0 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
17d00 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
17d10 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
17d20 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
17d30 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
17d40 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
17d50 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
17d60 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
17d70 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
17d80 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
17d90 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
17da0 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
17db0 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
17dc0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
17dd0 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
17de0 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
17df0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
17e00 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
17e10 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
17e20 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
17e30 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
17e40 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
17e50 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
17e60 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
17e70 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
17e80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17e90 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17ea0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
17eb0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
17ec0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
17ed0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
17ee0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
17ef0 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
17f00 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
17f10 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
17f20 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
17f30 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
17f40 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
17f50 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
17f60 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
17f70 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
17f80 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
17f90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17fa0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
17fb0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
17fc0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
17fd0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
17fe0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
17ff0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
18000 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
18010 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
18020 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
18030 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
18040 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
18050 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
18060 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
18070 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
18080 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
18090 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
180a0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
180b0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
180c0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
180d0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
180e0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
180f0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
18100 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
18110 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
18120 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
18130 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
18140 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
18150 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
18160 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
18170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
18180 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
18190 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
181a0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
181b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
181c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
181d0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
181e0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
181f0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
18200 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
18210 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
18220 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
18230 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
18240 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
18250 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
18260 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
18270 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
18280 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
18290 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
182a0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
182b0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
182c0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
182d0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
182e0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
182f0 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
18300 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
18310 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
18320 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
18330 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
18340 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
18350 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
18360 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
18370 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
18380 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
18390 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
183a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
183b0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
183c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
183d0 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
183e0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
183f0 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
18400 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18410 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
18420 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
18430 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18440 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
18450 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
18460 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
18470 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
18480 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
18490 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  }.  if( pFile->d
184a0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69  irfd>=0 ){.    i
184b0 6e 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52  nt err;.    OSTR
184c0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d  ACE(("DIRSYNC %-
184d0 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  3d (have_fullfsy
184e0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
184f0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69  d)\n", pFile->di
18500 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rfd,.           
18510 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
18520 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23   isFullsync));.#
18530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
18540 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
18550 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f    /* The directo
18560 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20  ry sync is only 
18570 61 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c  attempted if ful
18580 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a  l_fsync is.    *
18590 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  * turned off or 
185a0 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66  unavailable.  If
185b0 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63   a full_fsync oc
185c0 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20  curred above,.  
185d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69    ** then the di
185e0 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
185f0 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20  superfluous..   
18600 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41   */.    if( (!HA
18610 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20  VE_FULLFSYNC || 
18620 21 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20  !isFullsync) && 
18630 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
18640 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a  ->dirfd,0,0) ){.
18650 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
18660 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65   ** We have rece
18670 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65  ived multiple re
18680 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29  ports of fsync()
18690 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   returning.     
186a0 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e    ** errors when
186b0 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65   applied to dire
186c0 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61  ctories on certa
186d0 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  in file systems.
186e0 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69  .       ** A fai
186f0 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79  led directory sy
18700 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20  nc is not a big 
18710 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65  deal.  So it see
18720 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74  ms.       ** bet
18730 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68  ter to ignore th
18740 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74  e error.  Ticket
18750 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f   #1657.       */
18760 0a 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65  .       /* pFile
18770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18780 72 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f  rno; */.       /
18790 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
187a0 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
187b0 23 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d  #endif.    err =
187c0 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
187d0 72 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65  rfd); /* Only ne
187e0 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
187f0 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f   so close the */
18800 0a 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20  .    if( err==0 
18810 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
18820 2f 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  /* directory whe
18830 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f  n we are done */
18840 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  .      pFile->di
18850 72 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  rfd = -1;.    }e
18860 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
18870 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18880 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
18890 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
188a0 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
188b0 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 20 70 46  OSE, "close", pF
188c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
188d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
188e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
188f0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
18900 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
18910 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
18920 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
18930 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
18940 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
18950 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18960 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
18970 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
18980 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
18990 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
189a0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
189b0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
189c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
189d0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
189e0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
189f0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
18a00 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
18a10 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
18a20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
18a30 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
18a40 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
18a50 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
18a60 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
18a70 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
18a80 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
18a90 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
18aa0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
18ab0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
18ac0 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79  Chunk ){.    nBy
18ad0 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
18ae0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
18af0 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
18b00 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
18b10 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  unk;.  }..  rc =
18b20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
18b30 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66  e(pFile->h, (off
18b40 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
18b50 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
18b60 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
18b70 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
18b80 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
18b90 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
18ba0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
18bb0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
18bc0 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
18bd0 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
18be0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
18bf0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
18c00 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18c10 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
18c20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
18c30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
18c40 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
18c50 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
18c60 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
18c70 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
18c80 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
18c90 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
18ca0 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
18cb0 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
18cc0 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
18cd0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
18ce0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
18cf0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
18d00 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
18d10 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
18d20 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
18d30 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
18d40 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
18d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
18d60 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18d70 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
18d80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
18d90 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
18da0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18dc0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
18dd0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
18de0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
18df0 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
18e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
18e10 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  ixFileSize(sqlit
18e20 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
18e30 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
18e40 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  rc;.  struct sta
18e50 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28  t buf;.  assert(
18e60 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 66 73   id );.  rc = fs
18e70 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
18e80 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
18e90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18ea0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
18eb0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75  rc!=0 ){.    ((u
18ec0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
18ed0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
18ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18ef0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
18f00 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
18f10 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f  uf.st_size;..  /
18f20 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
18f30 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62   zero-size datab
18f40 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f  ase, the findIno
18f50 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75  deInfo() procedu
18f60 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61  re.  ** writes a
18f70 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74   single byte int
18f80 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f  o that file in o
18f90 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f  rder to work aro
18fa0 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69  und a bug.  ** i
18fb0 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73  n the OS-X msdos
18fc0 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e   filesystem.  In
18fd0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
18fe0 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70  problems with up
18ff0 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c  per.  ** layers,
19000 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f   we need to repo
19010 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a  rt this file siz
19020 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74  e as zero even t
19030 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a  hough it is.  **
19040 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63   really 1.   Tic
19050 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a  ket #3260..  */.
19060 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20    if( *pSize==1 
19070 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a  ) *pSize = 0;...
19080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19090 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
190a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
190b0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
190c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
190d0 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70  ** Handler for p
190e0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c  roxy-locking fil
190f0 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e  e-control verbs.
19100 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20    Defined below 
19110 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69  in the.** proxyi
19120 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73  ng locking divis
19130 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
19140 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74  nt proxyFileCont
19150 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
19160 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65  *,int,void*);.#e
19170 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  ndif../* .** Thi
19180 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
19190 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  lled to handle t
191a0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
191b0 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69  SIZE_HINT .** fi
191c0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61  le-control opera
191d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
191e0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
191f0 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
19200 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
19210 65 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 0a 2a  e, it could be.*
19220 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
19230 6e 65 65 64 73 20 74 6f 20 62 65 20 65 78 74 65  needs to be exte
19240 6e 64 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  nded at this poi
19250 6e 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  nt. Otherwise, t
19260 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  he.** SQLITE_FCN
19270 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 6f 70 65  TL_SIZE_HINT ope
19280 72 61 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  ration is a no-o
19290 70 20 66 6f 72 20 55 6e 69 78 2e 0a 2a 2f 0a 73  p for Unix..*/.s
192a0 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53  tatic int fcntlS
192b0 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65  izeHint(unixFile
192c0 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79   *pFile, i64 nBy
192d0 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  te){.  if( pFile
192e0 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20  ->szChunk ){.   
192f0 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19310 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
19320 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
19330 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
19340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
19350 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
19360 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
19370 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
19380 28 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  ( fstat(pFile->h
19390 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e  , &buf) ) return
193a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
193b0 54 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20  TAT;..    nSize 
193c0 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d  = ((nByte+pFile-
193d0 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46  >szChunk-1) / pF
193e0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
193f0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
19400 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69      if( nSize>(i
19410 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  64)buf.st_size )
19420 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
19430 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
19440 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
19450 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
19460 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
19470 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  do{.        rc =
19480 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
19490 28 70 46 69 6c 65 2d 2e 68 2c 20 62 75 66 2e 73  (pFile-.h, buf.s
194a0 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75  t_size, nSize-bu
194b0 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 20 20 20  f.st_size;.     
194c0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
194d0 20 65 72 72 6e 6f 3d 45 49 4e 54 52 20 29 3b 0a   errno=EINTR );.
194e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
194f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19500 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
19510 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
19520 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
19530 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
19540 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72  (), fake it. Fir
19550 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  st use.      ** 
19560 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73  ftruncate() to s
19570 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  et the file size
19580 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73  , then write a s
19590 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20  ingle byte to.  
195a0 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
195b0 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f  byte in each blo
195c0 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ck within the ex
195d0 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
195e0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
195f0 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71  the same techniq
19600 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63  ue used by glibc
19610 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f   to implement po
19620 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a  six_fallocate().
19630 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74        ** on syst
19640 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ems that do not 
19650 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
19660 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63  ocate() system c
19670 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  all..      */.  
19680 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62      int nBlk = b
19690 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20  uf.st_blksize;  
196a0 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62  /* File-system b
196b0 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20  lock size */.   
196c0 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20     i64 iWrite;  
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
196e0 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f  * Next offset to
196f0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 20   write to */.   
19700 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 20 20     int nWrite;  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19720 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
19730 72 6f 6d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  rom seekAndWrite
19740 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  () */..      if(
19750 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
19760 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a  e(pFile->h, nSiz
19770 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  e) ){.        pF
19780 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
19790 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
197a0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
197b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
197c0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
197d0 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
197e0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
197f0 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28       iWrite = ((
19800 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a  buf.st_size + 2*
19810 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a  nBlk - 1)/nBlk)*
19820 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 64 6f  nBlk-1;.      do
19830 20 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74   {.        nWrit
19840 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
19850 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
19860 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
19870 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a  iWrite += nBlk;.
19880 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 6e        } while( n
19890 57 72 69 74 65 3d 3d 31 20 26 26 20 69 57 72 69  Write==1 && iWri
198a0 74 65 3c 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  te<nSize );.    
198b0 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
198c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
198d0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6e  IOERR_WRITE;.#en
198e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
198f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19900 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  K;.}../*.** Info
19910 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
19920 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
19930 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
19940 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
19950 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
19960 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
19970 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
19980 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
19990 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
199a0 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
199b0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
199c0 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69  )pArg = ((unixFi
199d0 6c 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f  le*)id)->eFileLo
199e0 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ck;.      return
199f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19a00 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19a10 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
19a20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
19a30 67 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  g = ((unixFile*)
19a40 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  id)->lastErrno;.
19a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19a70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19a80 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
19a90 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
19aa0 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b  le*)id)->szChunk
19ab0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
19ac0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19ad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
19ae0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
19af0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
19b00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  {.      return f
19b10 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e  cntlSizeHint((un
19b20 69 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69  ixFile *)id, *(i
19b30 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
19b40 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
19b50 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
19b60 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74  r calls this met
19b70 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  hod to signal th
19b80 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20  at it has done. 
19b90 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
19ba0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
19bb0 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66  tabase is theref
19bc0 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  ore unchanged an
19bd0 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63  d.    ** it henc
19be0 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  e it is OK for t
19bf0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19c00 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
19c10 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61   be.    ** uncha
19c20 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nged..    */.   
19c30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19c40 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a  TL_DB_UNCHANGED:
19c50 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46   {.      ((unixF
19c60 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61  ile*)id)->dbUpda
19c70 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  te = 0;.      re
19c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
19ca0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19cb0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
19cc0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19cd0 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  _).    case SQLI
19ce0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
19cf0 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
19d00 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
19d10 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
19d20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c   return proxyFil
19d30 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70  eControl(id,op,p
19d40 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Arg);.    }.#end
19d50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
19d60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19d70 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
19d80 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20  PPLE__) */.  }. 
19d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19da0 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
19db0 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
19dc0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
19dd0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
19de0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
19df0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
19e00 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
19e10 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
19e20 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
19e30 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
19e40 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
19e50 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
19e60 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
19e70 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
19e80 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
19e90 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
19ea0 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
19eb0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
19ec0 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
19ed0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
19ee0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
19ef0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
19f00 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
19f10 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
19f20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
19f30 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
19f40 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
19f50 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19f60 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
19f70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
19f80 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
19f90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19fa0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
19fb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19fc0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
19fd0 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
19fe0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
19ff0 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e  ways 0 for unix.
1a000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a010 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1a020 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1a030 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b  _file *NotUsed){
1a040 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a050 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1a060 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
1a070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a080 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1a090 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1a0a0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1a0b0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1a0c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1a0d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1a0e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1a0f0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1a100 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1a110 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1a120 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1a130 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1a140 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1a150 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1a160 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1a170 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1a180 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1a190 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1a1a0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1a1b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1a1c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1a1d0 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1a1e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1a1f0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1a200 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1a210 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1a220 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1a230 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1a240 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1a250 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1a260 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1a270 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1a280 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1a290 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1a2a0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1a2b0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1a2c0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1a2d0 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1a2e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1a2f0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1a300 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1a310 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1a320 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1a330 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1a340 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1a350 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1a360 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1a370 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1a380 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1a390 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1a3a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1a3b0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1a3c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1a3d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1a3e0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1a3f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1a400 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1a410 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1a420 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1a430 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1a440 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1a450 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1a460 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1a470 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1a480 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1a490 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1a4a0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1a4b0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1a4c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1a4d0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1a4e0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1a4f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1a500 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1a510 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1a520 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1a530 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1a540 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1a550 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1a560 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1a570 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1a580 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1a590 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1a5a0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1a5b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a5c0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1a5d0 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1a600 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1a610 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1a620 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a630 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1a640 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1a650 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
1a660 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a670 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1a680 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  on */.  char **a
1a690 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
1a6a0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
1a6b0 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
1a6c0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
1a6d0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a6f0 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
1a700 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1a710 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
1a720 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
1a730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1a740 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
1a750 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1a760 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
1a770 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
1a780 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1a790 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1a7a0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1a7b0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
1a7c0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1a7d0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1a7e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
1a7f0 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
1a800 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
1a810 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
1a820 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
1a830 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
1a840 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
1a850 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
1a860 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
1a870 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
1a880 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
1a890 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1a8a0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1a8b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a8c0 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
1a8d0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
1a8e0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1a8f0 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
1a900 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
1a910 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
1a920 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
1a930 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
1a940 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
1a950 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
1a960 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
1a970 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
1a980 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
1a990 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
1a9a0 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
1a9b0 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
1a9c0 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
1a9d0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1a9e0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
1a9f0 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
1aa00 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
1aa10 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
1aa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1aa30 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
1aa40 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
1aa50 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
1aa60 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
1aa70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
1aa80 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
1aa90 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
1aaa0 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
1aab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1aac0 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1aad0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1aae0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
1aaf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ab00 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
1ab10 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
1ab20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ab30 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab50 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
1ab60 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
1ab70 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
1ab80 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
1ab90 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
1aba0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
1abb0 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
1abc0 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
1abd0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
1abe0 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  )         /* fir
1abf0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
1ac00 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
1ac10 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48  _DMS    (UNIX_SH
1ac20 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
1ac30 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
1ac40 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1ac50 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69  /*.** Apply posi
1ac60 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  x advisory locks
1ac70 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66   for all bytes f
1ac80 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68  rom ofst through
1ac90 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a   ofst+n-1..**.**
1aca0 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20   Locks block if 
1acb0 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63  the mask is exac
1acc0 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61  tly UNIX_SHM_C a
1acd0 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b  nd are non-block
1ace0 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ing.** otherwise
1acf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ad00 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
1ad10 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  k(.  unixShmNode
1ad20 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41   *pShmNode, /* A
1ad30 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
1ad40 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
1ad50 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
1ad60 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
1ad70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
1ad80 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
1ad90 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
1ada0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1adb0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
1adc0 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
1add0 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
1ade0 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
1adf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ae00 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
1ae10 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
1ae20 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a  lock f;       /*
1ae30 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   The posix advis
1ae40 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ory locking stru
1ae50 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72  cture */.  int r
1ae60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1ae70 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1ae80 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
1ae90 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1aea0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1aeb0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1aec0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1aed0 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1aee0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1aef0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
1af00 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
1af10 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
1af20 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
1af30 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
1af40 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
1af50 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1af60 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
1af70 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
1af80 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
1af90 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
1afa0 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54   n>=1 && n<SQLIT
1afb0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a  E_SHM_NLOCK );..
1afc0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1afd0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1afe0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73  meters */.  mems
1aff0 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&f, 0, sizeof
1b000 28 66 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65  (f));.  f.l_type
1b010 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66   = lockType;.  f
1b020 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
1b030 5f 53 45 54 3b 0a 20 20 66 2e 6c 5f 73 74 61 72  _SET;.  f.l_star
1b040 74 20 3d 20 6f 66 73 74 3b 0a 20 20 66 2e 6c 5f  t = ofst;.  f.l_
1b050 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 72 63 20 3d  len = n;..  rc =
1b060 20 66 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d   fcntl(pShmNode-
1b070 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
1b080 3b 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d  ;.  rc = (rc!=(-
1b090 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
1b0a0 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a  : SQLITE_BUSY;..
1b0b0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1b0c0 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
1b0d0 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
1b0e0 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
1b0f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1b100 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
1b110 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1b120 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28   "));.  mask = (
1b130 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
1b140 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
1b150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b160 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1b170 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
1b180 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
1b190 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
1b1a0 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
1b1b0 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
1b1c0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
1b1d0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
1b1e0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1b1f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
1b200 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
1b210 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b220 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
1b230 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1b240 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1b250 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1b260 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1b270 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1b280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b290 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1b2a0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1b2b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1b2c0 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
1b2d0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
1b2e0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1b2f0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1b300 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
1b310 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1b320 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1b330 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1b340 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
1b350 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
1b360 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
1b370 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
1b380 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
1b390 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
1b3a0 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
1b3b0 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
1b3c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b3d0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1b3e0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1b3f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1b400 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
1b410 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
1b420 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
1b430 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
1b440 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
1b450 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1b460 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
1b470 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
1b480 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
1b490 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
1b4a0 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a        .}.../*.**
1b4b0 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
1b4c0 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
1b4d0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
1b4e0 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
1b4f0 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
1b500 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
1b510 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1b520 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
1b530 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
1b540 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
1b550 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1b560 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
1b570 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
1b580 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
1b590 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
1b5a0 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
1b5b0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
1b5c0 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
1b5d0 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
1b5e0 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
1b5f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b600 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49     assert( p->pI
1b610 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64  node==pFd->pInod
1b620 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e );.    if( p->
1b630 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
1b640 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
1b650 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
1b660 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
1b670 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 75 6e   i++){.      mun
1b680 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
1b690 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
1b6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b6b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1b6c0 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
1b6d0 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 70  ->h>=0 ) close(p
1b6e0 2d 3e 68 29 3b 0a 20 20 20 20 70 2d 3e 70 49 6e  ->h);.    p->pIn
1b6f0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1b700 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
1b710 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
1b720 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72  *.** Open a shar
1b730 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61  ed-memory area a
1b740 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f  ssociated with o
1b750 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1b760 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68  e pDbFd.  .** Th
1b770 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d  is particular im
1b780 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
1b790 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
1b7a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  .**.** The file 
1b7b0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1b7c0 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  t shared-memory 
1b7d0 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  is in the same d
1b7e0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74  irectory.** as t
1b7f0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1b800 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68   file and has th
1b810 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
1b820 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1b830 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68  .** file with th
1b840 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20  e "-shm" suffix 
1b850 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  added.  For exam
1b860 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61  ple, if the data
1b870 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20  base file.** is 
1b880 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
1b890 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65  fig.db" then the
1b8a0 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72   file that is cr
1b8b0 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  eated and mmappe
1b8c0 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20  d.** for shared 
1b8d0 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63  memory will be c
1b8e0 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65  alled "/home/use
1b8f0 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d  r1/config.db-shm
1b900 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68  ".  .**.** Anoth
1b910 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69  er approach to i
1b920 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69  s to use files i
1b930 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64  n /dev/shm or /d
1b940 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20  ev/tmp or an.** 
1b950 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73  some other tmpfs
1b960 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61   mount. But if a
1b970 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65   file in a diffe
1b980 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a  rent directory.*
1b990 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  * from the datab
1b9a0 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64  ase file is used
1b9b0 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67  , then differing
1b9c0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
1b9d0 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f  ons.** or a chro
1b9e0 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65  ot() might cause
1b9f0 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70   two different p
1ba00 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20  rocesses on the 
1ba10 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  same.** database
1ba20 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67   to end up using
1ba30 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
1ba40 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
1ba50 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  ry - .** meaning
1ba60 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f   that their memo
1ba70 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61  ry would not rea
1ba80 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20  lly be shared - 
1ba90 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20  resulting.** in 
1baa0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1bab0 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ion.  Neverthele
1bac0 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66  ss, this tmpfs f
1bad0 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e  ile usage.** can
1bae0 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63   be enabled at c
1baf0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e  ompile-time usin
1bb00 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44  g -DSQLITE_SHM_D
1bb10 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73  IRECTORY="/dev/s
1bb20 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71  hm".** or the eq
1bb30 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75  uivalent.  The u
1bb40 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  se of the SQLITE
1bb50 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
1bb60 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f  ompile-time.** o
1bb70 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ption results in
1bb80 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1bb90 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65   build of SQLite
1bba0 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c  ;  builds of SQL
1bbb0 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68  ite.** that with
1bbc0 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54   differing SQLIT
1bbd0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
1bbe0 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74  settings attempt
1bbf0 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73   to use the.** s
1bc00 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
1bc10 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
1bc20 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72  me, database cor
1bc30 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b  ruption will lik
1bc40 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54  ely.** result. T
1bc50 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1bc60 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1bc70 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63  time option is c
1bc80 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e  onsidered.** "un
1bc90 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d  supported" and m
1bca0 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20  ay go away in a 
1bcb0 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65  future SQLite re
1bcc0 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lease..**.** Whe
1bcd0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1bce0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1bcf0 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1bd00 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1bd10 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1bd20 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1bd30 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1bd40 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1bd50 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1bd60 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1bd70 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1bd80 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1bd90 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1bda0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1bdb0 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
1bdc0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
1bdd0 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1bde0 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
1bdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1be00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1be10 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1be20 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
1be30 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
1be40 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1be50 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1be60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1be90 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
1bea0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1beb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
1bec0 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
1bed0 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  ar *zShmFilename
1bee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bef0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1bf00 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a  e used for SHM *
1bf10 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65  /.  int nShmFile
1bf20 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1bf30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1bf40 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20  he SHM filename 
1bf50 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1bf60 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
1bf70 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
1bf80 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  xShm object. */.
1bf90 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
1bfa0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1bfb0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
1bfc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1bfd0 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
1bfe0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1bff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
1c000 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
1c010 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1c020 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
1c030 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
1c040 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
1c050 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
1c060 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
1c070 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
1c080 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
1c090 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1c0a0 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
1c0b0 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
1c0c0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1c0d0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1c0e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
1c0f0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
1c100 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c120 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
1c130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1c140 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  /..    /* Call f
1c150 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
1c160 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
1c170 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
1c180 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
1c190 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
1c1a0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1c1b0 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
1c1c0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
1c1d0 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
1c1e0 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
1c1f0 69 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74  issions. The act
1c200 75 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ual permissions 
1c210 74 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61  the file is crea
1c220 74 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ted.    ** with 
1c230 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74  are subject to t
1c240 68 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b  he current umask
1c250 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1c260 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 28 70  .    if( fstat(p
1c270 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
1c280 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c290 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1c2a0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1c2b0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1c2c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1c2d0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
1c2e0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
1c2f0 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
1c300 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
1c310 20 33 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   30;.#else.    n
1c320 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 35 20  ShmFilename = 5 
1c330 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44  + (int)strlen(pD
1c340 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  bFd->zPath);.#en
1c350 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
1c360 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1c370 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
1c380 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
1c390 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
1c3a0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
1c3b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c3c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1c3d0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1c3e0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1c3f0 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
1c400 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 29  zeof(*pShmNode))
1c410 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
1c420 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
1c430 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1c440 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
1c450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
1c460 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
1c470 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c480 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
1c490 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
1c4c0 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
1c4d0 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
1c500 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
1c510 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
1c520 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1c530 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
1c540 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
1c550 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1c560 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1c570 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
1c580 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
1c590 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1c5a0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
1c5b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
1c5c0 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
1c5d0 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
1c5e0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1c5f0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1c600 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1c610 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1c620 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1c630 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c640 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1c650 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1c660 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 68  ;.    }..    pSh
1c670 6d 4e 6f 64 65 2d 3e 68 20 3d 20 6f 70 65 6e 28  mNode->h = open(
1c680 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  zShmFilename, O_
1c690 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73  RDWR|O_CREAT, (s
1c6a0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
1c6b0 37 37 37 29 29 3b 0a 20 20 20 20 69 66 28 20 70  777));.    if( p
1c6c0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
1c6d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
1c6e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1c6f0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1c700 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
1c710 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
1c720 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1c730 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
1c740 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
1c750 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1c760 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
1c770 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
1c780 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
1c790 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1c7a0 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20  zero length. .  
1c7b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
1c7c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28  LITE_OK;.    if(
1c7d0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1c7e0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57  ck(pShmNode, F_W
1c7f0 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
1c800 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1c810 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
1c820 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1c830 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20  pShmNode->h, 0) 
1c840 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c850 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c860 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1c870 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
1c880 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
1c890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c8a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c8b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1c8c0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
1c8d0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52  ck(pShmNode, F_R
1c8e0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
1c8f0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
1c900 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1c910 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1c920 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1c930 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1c940 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
1c950 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1c960 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1c970 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
1c980 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
1c990 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
1c9a0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
1c9b0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
1c9c0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
1c9d0 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
1c9e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
1c9f0 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1ca00 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1ca10 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1ca20 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1ca30 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1ca40 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
1ca50 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
1ca60 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
1ca70 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
1ca80 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
1ca90 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
1caa0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1cab0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1cac0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1cad0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1cae0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1caf0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1cb00 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1cb10 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1cb20 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1cb30 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1cb40 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1cb50 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1cb60 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1cb70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cb80 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1cb90 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1cba0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1cbb0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1cbc0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1cbd0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cbe0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1cbf0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1cc00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1cc10 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1cc20 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1cc30 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
1cc40 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
1cc50 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1cc60 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1cc70 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1cc80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1cc90 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
1cca0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1ccb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ccc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ccd0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1cce0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1ccf0 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1cd00 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
1cd10 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1cd20 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1cd30 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1cd40 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1cd50 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
1cd60 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
1cd70 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
1cd80 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1cd90 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
1cda0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1cdb0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1cdc0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1cdd0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cde0 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1cdf0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1ce00 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1ce10 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
1ce20 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1ce30 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1ce40 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1ce50 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1ce60 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1ce70 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1ce80 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1ce90 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1cea0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1ceb0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1cec0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1ced0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
1cee0 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
1cef0 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
1cf00 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1cf10 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1cf20 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
1cf30 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1cf40 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
1cf50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1cf60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
1cf70 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1cf80 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1cf90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
1cfa0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
1cfb0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
1cfc0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1cfd0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
1cfe0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
1cff0 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
1d000 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1d010 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1d020 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1d030 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1d040 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
1d050 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1d060 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d070 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
1d080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1d090 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
1d0a0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
1d0b0 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
1d0c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1d0d0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1d0e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
1d0f0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
1d100 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1d130 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
1d140 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
1d150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d160 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
1d170 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
1d180 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
1d190 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
1d1a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
1d1b0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
1d1c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
1d1d0 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
1d1e0 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
1d1f0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1d200 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1d210 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d220 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
1d230 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1d240 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1d250 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1d260 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
1d270 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
1d280 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
1d290 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1d2a0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1d2b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1d2c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1d2d0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1d2e0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
1d2f0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
1d300 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d310 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1d320 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1d330 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1d340 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1d350 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1d360 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1d370 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1d380 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
1d390 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
1d3c0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1d3d0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1d3e0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1d3f0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1d400 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1d410 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1d420 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1d430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1d440 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
1d450 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
1d460 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
1d470 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
1d480 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1d490 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
1d4a0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1d4b0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1d4c0 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
1d4d0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
1d4e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1d4f0 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
1d500 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
1d510 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
1d520 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
1d530 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1d540 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
1d550 20 69 66 28 20 66 73 74 61 74 28 70 53 68 6d 4e   if( fstat(pShmN
1d560 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
1d570 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d580 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1d590 5a 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  ZE;.      goto s
1d5a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1d5b0 7d 0a 0a 20 20 20 20 69 66 28 20 73 53 74 61 74  }..    if( sStat
1d5c0 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
1d5d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1d5e0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1d5f0 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
1d600 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e  exist. If bExten
1d610 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  d is set to.    
1d620 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74    ** false, exit
1d630 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
1d640 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
1d650 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1d660 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
1d670 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
1d680 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
1d690 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65  end is true, use
1d6a0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1d6b0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1d6c0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1d6d0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1d6e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1d6f0 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74  ( !bExtend ) got
1d700 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1d710 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1d720 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
1d730 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  de->h, nByte) ){
1d740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
1d750 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1d760 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1d770 22 66 74 72 75 6e 63 61 74 65 22 2c 70 53 68 6d  "ftruncate",pShm
1d780 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
1d790 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1d7a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1d7b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d7c0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1d7d0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1d7e0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1d7f0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1d800 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1d810 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c  w = (char **)sql
1d820 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
1d830 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d840 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  apRegion, (iRegi
1d850 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61  on+1)*sizeof(cha
1d860 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
1d870 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
1d880 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d890 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1d8a0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1d8b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
1d8c0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
1d8d0 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
1d8e0 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e  hile(pShmNode->n
1d8f0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29  Region<=iRegion)
1d900 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  {.      void *pM
1d910 65 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52  em = mmap(0, szR
1d920 65 67 69 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44  egion, PROT_READ
1d930 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20  |PROT_WRITE, .  
1d940 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
1d950 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
1d960 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1d970 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20 20  on*szRegion.    
1d980 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
1d990 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  Mem==MAP_FAILED 
1d9a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d9b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
1d9c0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1d9d0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1d9e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d9f0 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  apRegion[pShmNod
1da00 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70 4d  e->nRegion] = pM
1da10 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  em;.      pShmNo
1da20 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
1da30 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
1da40 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
1da50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
1da60 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
1da70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
1da80 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
1da90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1daa0 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  p = 0;.  }.  sql
1dab0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1dac0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1dad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1dae0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1daf0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
1db00 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
1db10 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  ry segment..**.*
1db20 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1db30 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
1db40 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20  ween SHAREd and 
1db50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
1db60 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64  is a little.** d
1db70 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68  ifferent here th
1db80 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e  an in posix.  In
1db90 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65   xShmLock(), one
1dba0 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c   can go from unl
1dbb0 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72  ocked.** to shar
1dbc0 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66  ed and back or f
1dbd0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
1dbe0 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61  exclusive and ba
1dbf0 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79  ck.  But one may
1dc00 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20  .** not go from 
1dc10 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73  shared to exclus
1dc20 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c  ive or from excl
1dc30 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e  usive to shared.
1dc40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1dc50 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  nixShmLock(.  sq
1dc60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1dc70 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1dc80 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
1dc90 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1dca0 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
1dcb0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1dcc0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
1dcd0 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
1dce0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1dcf0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
1dd00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dd10 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
1dd20 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1dd30 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1dd60 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
1dd70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1dd80 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
1dd90 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f  *)fd;      /* Co
1dda0 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
1ddb0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1ddc0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  /.  unixShm *p =
1ddd0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
1dde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ddf0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1de00 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
1de10 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20   unixShm *pX;   
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1de40 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
1de50 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69  iblings */.  uni
1de60 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
1de70 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1de80 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  ;  /* The underl
1de90 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20  ying file iNode 
1dea0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1deb0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1dec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ded0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1dee0 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1df10 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1df20 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1df30 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
1df40 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
1df50 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
1df60 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1df70 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
1df80 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
1df90 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
1dfa0 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
1dfb0 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
1dfc0 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
1dfd0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
1dfe0 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1dff0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1e000 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1e010 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1e020 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1e030 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
1e040 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1e050 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1e060 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
1e070 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1e080 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1e090 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1e0a0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1e0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
1e0c0 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
1e0d0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1e0e0 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
1e0f0 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
1e100 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
1e110 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1e120 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1e130 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1e140 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1e150 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1e160 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1e170 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1e180 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1e190 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1e1a0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1e1b0 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1e1c0 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1e1d0 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1e1e0 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1e1f0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1e200 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1e210 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1e220 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1e230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1e240 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1e250 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1e260 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1e270 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1e280 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1e290 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1e2a0 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1e2b0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1e2c0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1e2d0 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1e2e0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1e2f0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
1e300 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1e310 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
1e320 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
1e330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1e350 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e360 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
1e370 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1e380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e390 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
1e3a0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1e3b0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1e3c0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1e3d0 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
1e3e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1e3f0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
1e400 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
1e410 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1e420 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1e430 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1e440 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
1e450 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
1e460 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
1e470 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
1e480 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
1e490 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
1e4a0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
1e4b0 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
1e4c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
1e4d0 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
1e4e0 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
1e4f0 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
1e500 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1e510 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1e520 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1e530 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1e540 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1e550 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e560 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1e570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e580 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
1e590 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
1e5a0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1e5b0 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
1e5c0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1e5d0 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
1e5e0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1e5f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e600 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
1e610 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
1e620 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e630 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
1e640 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1e650 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
1e660 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
1e670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e680 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e690 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1e6a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1e6b0 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
1e6c0 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
1e6d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e6e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
1e6f0 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
1e700 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1e710 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1e720 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
1e730 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
1e740 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
1e750 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
1e760 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
1e770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1e780 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
1e790 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
1e7a0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1e7b0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1e7c0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1e7d0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1e7e0 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
1e7f0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1e800 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1e810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1e820 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1e830 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1e840 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
1e850 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1e860 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1e870 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
1e880 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
1e890 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
1e8a0 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
1e8b0 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
1e8c0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1e8d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e8e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
1e8f0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1e900 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
1e910 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
1e920 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1e930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1e950 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
1e960 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
1e970 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
1e980 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1e990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e9a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1e9b0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1e9c0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
1e9d0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1e9e0 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
1e9f0 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
1ea00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
1ea10 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
1ea20 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
1ea30 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
1ea40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea50 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
1ea60 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
1ea70 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
1ea80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
1ea90 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
1eaa0 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
1eab0 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
1eac0 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
1ead0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
1eae0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
1eaf0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
1eb00 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1eb10 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
1eb20 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
1eb30 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
1eb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1eb50 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
1eb60 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1eb70 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
1eb80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1eb90 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
1eba0 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
1ebb0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
1ebc0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1ebd0 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1ebe0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1ebf0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ec00 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
1ec10 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
1ec20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1ec30 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
1ec40 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1ec50 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
1ec60 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
1ec70 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
1ec80 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
1ec90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1eca0 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
1ecb0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ecd0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
1ece0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1ecf0 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
1ed20 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
1ed30 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
1ed40 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1ed50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ed60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1ed70 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
1ed80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
1ed90 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
1eda0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1edb0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1edc0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
1edd0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
1ede0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1edf0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
1ee00 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1ee10 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
1ee20 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
1ee30 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
1ee40 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
1ee50 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
1ee60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1ee70 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
1ee80 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
1ee90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1eea0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
1eeb0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1eec0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1eed0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1eee0 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
1eef0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
1ef00 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
1ef10 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
1ef20 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
1ef30 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
1ef40 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
1ef50 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
1ef60 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
1ef70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1ef80 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1ef90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
1efa0 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
1efb0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
1efc0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
1efd0 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
1efe0 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
1eff0 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
1f000 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
1f010 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
1f020 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
1f030 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1f040 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1f050 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
1f060 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
1f070 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
1f080 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
1f090 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
1f0a0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
1f0b0 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
1f0c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
1f0d0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
1f0e0 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
1f0f0 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
1f100 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1f110 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
1f120 65 6c 65 74 65 46 6c 61 67 20 29 20 75 6e 6c 69  eleteFlag ) unli
1f130 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  nk(pShmNode->zFi
1f140 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69  lename);.    uni
1f150 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
1f160 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
1f170 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
1f180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f190 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
1f1a0 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
1f1b0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
1f1c0 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1f1d0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
1f1e0 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
1f1f0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
1f200 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1f210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f220 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  AL */../*.** Her
1f230 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
1f240 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
1f250 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1f260 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
1f270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f280 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
1f290 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
1f2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1f2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f300 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1f310 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
1f320 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
1f330 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
1f340 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1f350 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
1f360 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
1f370 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
1f380 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
1f390 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
1f3a0 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
1f3b0 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
1f3c0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1f3d0 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
1f3e0 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
1f3f0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
1f400 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
1f410 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
1f420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1f430 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
1f440 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
1f450 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
1f460 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
1f470 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
1f480 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
1f490 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
1f4a0 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
1f4b0 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
1f4c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
1f4d0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1f4e0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
1f4f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
1f500 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
1f510 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
1f520 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1f530 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
1f540 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
1f550 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
1f560 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
1f570 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
1f580 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
1f590 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
1f5a0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
1f5b0 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46  finder-funtion F
1f5c0 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72  , two objects ar
1f5d0 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  e created:.**.**
1f5e0 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c      (1) The real
1f5f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1f600 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22   named "FImpt()"
1f610 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41  ..**.**    (2) A
1f620 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65   constant pointe
1f630 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  r to this functi
1f640 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  on named just "F
1f650 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
1f660 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
1f670 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
1f680 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
1f690 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
1f6a0 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
1f6b0 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
1f6c0 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
1f6d0 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
1f6e0 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
1f6f0 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
1f700 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
1f710 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
1f720 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
1f730 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
1f740 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
1f750 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
1f760 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
1f770 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
1f780 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
1f790 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
1f7a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1f7b0 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
1f7c0 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
1f7d0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
1f7e0 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
1f7f0 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
1f800 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
1f810 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
1f820 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
1f830 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
1f840 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
1f850 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
1f860 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
1f870 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
1f880 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
1f890 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
1f8a0 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53  ER, METHOD, VERS
1f8b0 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  ION, CLOSE, LOCK
1f8c0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b  , UNLOCK, CKLOCK
1f8d0 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20  )      \.static 
1f8e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1f8f0 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
1f900 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49        \.   VERSI
1f930 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ON,             
1f940 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1f950 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1f9a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
1f9d0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1f9e0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
1fa20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fa30 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
1fa70 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1fa80 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
1fa90 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fad0 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
1fb10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fb20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fb50 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fba0 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbc0 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fbf0 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc10 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1fc20 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fc40 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1fc50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1fc60 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1fc90 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fcb0 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1fce0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1fcf0 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
1fd00 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
1fd10 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
1fd20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1fd30 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  ixShmMap,       
1fd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1fd50 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  mMap */         
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1fd80 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
1fd90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1fda0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1fdd0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1fde0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1fdf0 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1fe20 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20  hmUnmap         
1fe30 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
1fe40 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  map */          
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
1fec0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
1fed0 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
1fee0 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
1fef0 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
1ff00 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
1ff10 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
1ff20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
1ff60 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
20000 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20010 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
20020 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
20030 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
20040 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
20050 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
20060 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
20070 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20080 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
20090 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
200a0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
200b0 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
200c0 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
200d0 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
200e0 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
200f0 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
20100 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
20110 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
20120 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
20130 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
20140 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
20150 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
20160 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
20170 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
20180 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
20190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
201a0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e  red memory is en
201b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
201c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
201d0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
201e0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
201f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20200 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
20210 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
20220 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
20230 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
20240 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
20250 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20260 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
20270 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
20280 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
20290 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
202a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
202b0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
202c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
202d0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
202e0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
202f0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
20300 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
20330 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
20340 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
20350 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20360 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
20370 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
20380 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20390 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
203a0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
203b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
203c0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
203d0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
203e0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
203f0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
20400 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
20410 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
20420 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
20430 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
20440 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
20450 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
20460 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
20470 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
20480 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
20490 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
204c0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
204d0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
204e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
204f0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
20500 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
20510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20520 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
20530 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
20540 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
20550 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
20560 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
20570 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f  kReservedLock  /
20580 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
20590 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
205a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
205b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
205c0 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
205d0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
205e0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
205f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
20600 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
20610 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
20620 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
20630 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
20640 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
20650 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
20680 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
20690 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
206a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
206b0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
206c0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
206d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
206e0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
206f0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
20700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
20710 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
20720 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
20730 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
20740 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20750 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
20760 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
20770 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
20780 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
20790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
207a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
207b0 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
207c0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
207d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
207e0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
207f0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
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 73 68 61 72 65 64 20 6d 65      /* shared me
20820 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
20830 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
20860 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
20890 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
208c0 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
208d0 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
208e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
208f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
20900 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
20910 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
20920 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
20930 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
20940 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
20950 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
20960 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
20970 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
20980 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
20990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
209a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
209b0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
209c0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
209e0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
209f0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
20a00 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
20a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20a20 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
20a30 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
20a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
20a50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20a60 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
20a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
20a80 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
20a90 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
20aa0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
20ab0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20ac0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
20ad0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
20ae0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
20af0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
20b00 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
20b10 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
20b20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
20b30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
20b40 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
20b50 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
20b60 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
20b70 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
20b80 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
20b90 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
20ba0 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
20bb0 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
20bc0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
20bd0 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
20be0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
20bf0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
20c00 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
20c10 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
20c20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
20c30 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
20c40 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
20c50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
20c60 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
20c70 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
20c80 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
20c90 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
20ca0 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
20cb0 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
20cc0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
20cd0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
20ce0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
20cf0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
20d00 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
20d10 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
20d20 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
20d30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
20d40 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
20d50 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
20d60 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
20d70 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
20d80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20d90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
20da0 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
20db0 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
20dc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
20dd0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
20de0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
20df0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
20e00 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
20e10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
20e20 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
20e50 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
20e60 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
20e70 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
20e80 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
20e90 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
20ea0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20eb0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
20ec0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
20ed0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
20ee0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
20ef0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
20f00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
20f10 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
20f20 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
20f30 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
20f40 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
20f50 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
20f60 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
20f70 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
20f80 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
20f90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20fa0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
20fb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20fc0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
20fd0 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
20fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
20ff0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
21000 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
21010 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
21020 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
21030 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
21040 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
21070 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
21080 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
210b0 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
210e0 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b  d */.  nfsUnlock
210f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21100 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
21110 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
21120 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
21130 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
21140 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
21150 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
21160 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
21170 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
21180 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21190 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
211a0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
211b0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
211c0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
211d0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
211e0 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
211f0 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
21200 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
21210 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
21220 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
21230 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
21240 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
21250 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
21260 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
21270 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
21280 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
21290 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
212a0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
212b0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
212c0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
212d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
212e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
212f0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
21300 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
21310 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
21320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21330 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
21340 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
21350 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
21360 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
21370 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
21380 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
21390 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
213a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
213b0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
213c0 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
213d0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
213e0 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
213f0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
21400 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
21410 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
21420 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
21430 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
21440 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
21450 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
21460 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
21470 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
21480 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
21490 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
214a0 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
214b0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
214c0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
214d0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
214e0 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
214f0 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
21500 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
21510 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
21520 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
21530 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
21540 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
21550 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
21560 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
21570 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
21580 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
21590 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
215a0 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
215b0 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
215c0 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
215d0 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
215e0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
215f0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
21600 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
21610 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
21620 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
21630 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
21640 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
21650 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
21660 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
21670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
21680 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
21690 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
216a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
216b0 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
216c0 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
216d0 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
216e0 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
216f0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
21700 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
21710 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
21720 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
21730 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
21740 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
21750 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
21760 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
21770 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
21780 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
21790 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
217a0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
217b0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
217c0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
217d0 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20   fcntl(pNew->h, 
217e0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
217f0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
21800 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
21810 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
21820 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
21830 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
21840 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
21850 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
21860 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
21870 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
21880 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
21890 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
218a0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
218b0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
218c0 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
218d0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
218e0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
218f0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
21900 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
21910 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
21920 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21930 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
21940 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
21950 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
21960 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
21970 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21980 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
21990 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
219a0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
219b0 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
219c0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
219d0 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
219e0 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
219f0 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
21a00 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
21a10 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
21a20 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
21a30 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
21a40 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
21a50 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72 6b  is is for VXWork
21a60 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
21a70 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
21a80 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
21a90 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
21aa0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
21ab0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
21ac0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
21ad0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
21ae0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
21af0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
21b00 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
21b10 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
21b20 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
21b30 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
21b40 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
21b50 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
21b60 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
21b70 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
21b80 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
21b90 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
21ba0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
21bb0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
21bc0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
21bd0 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
21be0 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
21bf0 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
21c00 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
21c10 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
21c20 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
21c30 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
21c40 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
21c50 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
21c60 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
21c70 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
21c80 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
21c90 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
21ca0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
21cb0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
21cc0 69 66 28 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e  if( fcntl(pNew->
21cd0 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
21ce0 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20  kInfo)!=-1 ) {. 
21cf0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
21d00 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
21d10 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
21d20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  semIoMethods;.  
21d30 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
21d40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21d50 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
21d60 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
21d70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
21d80 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
21d90 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
21da0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
21db0 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45  XWORKS && SQLITE
21dc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
21dd0 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
21de0 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
21df0 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
21e00 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69  o a IO method fi
21e10 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a  nder function:.*
21e20 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20  /.typedef const 
21e30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21e40 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70  ds *(*finder_typ
21e50 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  e)(const char*,u
21e60 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a  nixFile*);.../**
21e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
21ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ed0 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
21ee0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
21ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f00 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
21f10 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
21f20 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
21f30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
21f40 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
21f50 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
21f60 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ..*/../*.** Init
21f70 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65  ialize the conte
21f80 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  nts of the unixF
21f90 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  ile structure po
21fa0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e  inted to by pId.
21fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21fc0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20  illInUnixFile(. 
21fd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
21fe0 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  fs,      /* Poin
21ff0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
22000 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  t */.  int h,   
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22020 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
22030 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62  riptor of file b
22040 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
22050 20 69 6e 74 20 64 69 72 66 64 2c 20 20 20 20 20   int dirfd,     
22060 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
22070 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
22080 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
22090 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
220a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
220b0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
220c0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
220d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
220e0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
220f0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
22100 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
22110 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20  t noLock,       
22120 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f        /* Omit lo
22130 63 6b 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  cking if true */
22140 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
22150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
22160 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66  lete on close if
22170 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f   true */.){.  co
22180 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
22190 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
221a0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
221b0 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
221c0 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
221d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
221e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
221f0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
22200 3b 0a 0a 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  ;..  /* Paramete
22210 72 20 69 73 44 65 6c 65 74 65 20 69 73 20 6f 6e  r isDelete is on
22220 6c 79 20 75 73 65 64 20 6f 6e 20 76 78 77 6f 72  ly used on vxwor
22230 6b 73 2e 20 45 78 70 72 65 73 73 20 74 68 69 73  ks. Express this
22240 20 65 78 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a   explicitly .  *
22250 2a 20 68 65 72 65 20 74 6f 20 70 72 65 76 65 6e  * here to preven
22260 74 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  t compiler warni
22270 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65 64  ngs about unused
22280 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
22290 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
222a0 45 54 45 52 28 69 73 44 65 6c 65 74 65 29 3b 0a  ETER(isDelete);.
222b0 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
222c0 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
222d0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
222e0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
222f0 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
22300 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
22310 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
22320 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
22330 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
22340 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
22350 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
22360 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
22370 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
22380 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
22390 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
223a0 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
223b0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
223c0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
223d0 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
223e0 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
223f0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
22400 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
22410 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
22420 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
22430 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
22440 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
22450 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
22460 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
22470 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
22480 68 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 72 66 64  h;.  pNew->dirfd
22490 20 3d 20 64 69 72 66 64 3b 0a 20 20 70 4e 65 77   = dirfd;.  pNew
224a0 2d 3e 66 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b  ->fileFlags = 0;
224b0 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
224c0 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 23 69 66   zFilename;..#if
224d0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
224e0 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
224f0 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
22500 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
22510 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
22520 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20    noLock = 1;.  
22530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22540 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
22550 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b  .  if( noLock ){
22560 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
22570 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
22580 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
22590 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
225a0 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
225b0 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
225c0 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
225d0 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
225e0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
225f0 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
22600 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
22610 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
22620 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
22630 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
22640 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
22650 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
22660 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
22670 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
22680 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
22690 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
226a0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
226b0 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
226c0 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
226d0 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
226e0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
226f0 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
22700 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
22710 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
22720 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
22730 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
22740 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
22750 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
22760 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
22770 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
22780 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
22790 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
227a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
227b0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
227c0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
227d0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
227e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
227f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
22800 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22810 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
22820 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
22830 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22840 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
22850 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
22860 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
22870 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
22880 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
22890 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
228a0 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
228b0 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
228c0 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
228d0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
228e0 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
228f0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
22900 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
22910 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
22920 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
22930 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
22940 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
22950 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
22960 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
22970 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
22980 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
22990 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
229a0 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
229b0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
229c0 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
229d0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
229e0 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
229f0 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
22a00 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
22a10 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
22a20 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
22a30 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
22a40 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22a50 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
22a60 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
22a70 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
22a80 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
22a90 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
22aa0 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
22ab0 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
22ac0 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
22ad0 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
22ae0 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
22af0 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
22b00 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
22b10 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
22b20 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
22b30 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
22b40 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
22b50 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
22b60 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
22b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6c 6f      */.      clo
22b80 73 65 28 68 29 3b 0a 20 20 20 20 20 20 68 20 3d  se(h);.      h =
22b90 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
22ba0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
22bb0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
22bc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
22bd0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
22be0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
22bf0 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
22c00 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
22c10 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
22c20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
22c30 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
22c40 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
22c50 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
22c60 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
22c70 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
22c80 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
22c90 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
22ca0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
22cb0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
22cc0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22cd0 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
22ce0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
22cf0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
22d00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
22d20 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
22d30 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
22d40 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
22d50 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
22d60 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
22d70 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
22d80 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
22d90 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
22da0 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
22db0 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
22dc0 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
22dd0 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
22de0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
22df0 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
22e00 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
22e10 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
22e20 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
22e30 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
22e40 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
22e50 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
22e60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22e80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22e90 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
22ea0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 63  text);.        c
22eb0 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 20  lose(h);.       
22ec0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
22ed0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
22ee0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
22ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
22f00 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
22f10 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
22f20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
22f30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
22f40 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
22f50 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
22f60 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
22f70 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
22f80 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
22f90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
22fa0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
22fb0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
22fc0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
22fd0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
22fe0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
22ff0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
23000 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
23010 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
23020 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
23030 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
23040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
23070 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
23080 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
23090 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
230a0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
230b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
230c0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
230d0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
230e0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
230f0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
23100 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
23110 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
23120 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
23130 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
23140 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
23150 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
23160 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
23170 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
23180 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
23190 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
231a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
231b0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
231c0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
231d0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
231e0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
231f0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
23200 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
23210 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
23220 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
23230 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
23240 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
23250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
23260 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
23270 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
23280 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232a0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
232b0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
232c0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
232d0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
232e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
232f0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
23300 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
23310 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
23320 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
23330 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
23340 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
23350 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
23360 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
23370 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
23380 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23390 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
233a0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
233b0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
233c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
233d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
233e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
233f0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
23400 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
23410 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
23420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23430 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
23440 20 29 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20   ) close(h);.   
23450 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c   h = -1;.    unl
23460 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
23470 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30      isDelete = 0
23480 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73  ;.  }.  pNew->is
23490 44 65 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74  Delete = isDelet
234a0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
234b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
234c0 0a 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d  .    if( dirfd>=
234d0 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29  0 ) close(dirfd)
234e0 3b 20 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b  ; /* silent leak
234f0 20 69 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64   if fail, alread
23500 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
23510 20 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f    if( h>=0 ) clo
23520 73 65 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  se(h);.  }else{.
23530 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
23540 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
23550 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
23560 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  er(+1);.  }.  re
23570 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23580 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  * Open a file de
23590 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
235a0 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
235b0 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e  ning file zFilen
235c0 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  ame..** If succe
235d0 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73  ssful, *pFd is s
235e0 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  et to the opened
235f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23600 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
23610 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
23620 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23630 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  s, either SQLITE
23640 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c  _NOMEM.** or SQL
23650 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20  ITE_CANTOPEN is 
23660 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46  returned and *pF
23670 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75  d is set to an u
23680 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75  ndefined.** valu
23690 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
236a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
236b0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
236c0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
236d0 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
236e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
236f0 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
23700 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
23710 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
23720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23730 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
23740 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
23750 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
23760 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
23770 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
23780 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23790 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
237a0 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
237b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
237c0 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
237d0 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
237e0 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
237f0 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
23800 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
23810 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
23820 27 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  ';.    fd = open
23830 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
23840 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
23850 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  ;.    if( fd>=0 
23860 29 7b 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f  ){.#ifdef FD_CLO
23870 45 58 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c  EXEC.      fcntl
23880 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
23890 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
238a0 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
238b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
238c0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
238d0 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
238e0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
238f0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
23900 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
23910 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
23920 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
23930 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
23940 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
23950 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  me));.}../*.** R
23960 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
23970 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
23980 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
23990 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
239a0 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
239b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
239c0 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
239d0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
239e0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
239f0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
23a00 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
23a10 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
23a20 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
23a30 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
23a40 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
23a50 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
23a60 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
23a70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20  ",.     0       
23a80 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
23a90 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e  tor */.  };.  un
23aa0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
23ab0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
23ac0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23ad0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69  Dir = 0;..  azDi
23ae0 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  rs[0] = sqlite3_
23af0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
23b00 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
23b10 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
23b20 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
23b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
23b40 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
23b50 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
23b60 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
23b70 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
23b80 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
23b90 20 20 20 69 66 28 20 73 74 61 74 28 7a 44 69 72     if( stat(zDir
23ba0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
23bb0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
23bc0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
23bd0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23be0 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 44 69    if( access(zDi
23bf0 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  r, 07) ) continu
23c00 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;.    break;.  
23c10 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b  }.  return zDir;
23c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
23c30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23c40 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
23c50 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
23c60 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
23c70 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
23c80 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
23c90 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
23ca0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
23cb0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
23cc0 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
23cd0 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
23ce0 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
23cf0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
23d00 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
23d10 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
23d20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
23d30 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
23d40 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
23d50 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
23d60 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
23d70 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64  789";.  unsigned
23d80 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e   int i, j;.  con
23d90 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a  st char *zDir;..
23da0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
23db0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
23dc0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
23dd0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
23de0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
23df0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
23e00 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
23e10 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
23e20 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
23e30 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
23e40 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  g. .  */.  Simul
23e50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
23e60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
23e70 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
23e80 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
23e90 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
23ea0 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f  zDir = ".";..  /
23eb0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
23ec0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
23ed0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
23ee0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
23ef0 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
23f00 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
23f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23f20 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ROR..  */.  if( 
23f30 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20  (strlen(zDir) + 
23f40 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45  strlen(SQLITE_TE
23f50 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
23f60 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74  + 17) >= (size_t
23f70 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74  )nBuf ){.    ret
23f80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23f90 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
23fa0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23fb0 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c  f(nBuf-17, zBuf,
23fc0 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d   "%s/"SQLITE_TEM
23fd0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
23fe0 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69  Dir);.    j = (i
23ff0 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b  nt)strlen(zBuf);
24000 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
24010 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
24020 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
24030 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
24040 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
24050 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
24060 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
24070 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
24080 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
24090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
240a0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
240b0 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
240c0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
240d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
240e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
240f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
24100 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
24110 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
24120 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
24130 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
24140 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
24150 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
24160 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
24170 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
24180 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
24190 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
241a0 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
241b0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
241c0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
241d0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
241e0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
241f0 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
24200 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
24210 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
24220 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
24230 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
24240 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
24250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
24260 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
24270 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
24280 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
24290 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
242a0 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
242b0 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
242c0 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
242d0 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
242e0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
242f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
24300 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
24310 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
24320 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
24330 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
24340 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
24350 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
24360 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
24370 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
24380 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
24390 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
243a0 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
243b0 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
243c0 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
243d0 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
243e0 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
243f0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
24400 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
24410 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
24420 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
24430 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
24440 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
24450 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
24460 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
24470 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
24480 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
24490 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
244a0 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
244b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
244c0 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
244d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
244e0 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
244f0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
24500 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
24510 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
24520 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
24530 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
24540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
24550 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
24560 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
24570 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
24580 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
24590 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
245a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
245b0 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
245c0 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
245d0 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
245e0 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
245f0 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
24600 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
24610 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
24620 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
24630 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
24640 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
24650 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
24660 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
24670 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
24680 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
24690 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
246a0 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
246b0 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
246c0 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
246d0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246f0 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
24700 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ) call */..  /* 
24710 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61  A stat() call ma
24720 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f  y fail for vario
24730 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74  us reasons. If t
24740 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20  his happens, it 
24750 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63  is.  ** almost c
24760 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f  ertain that an o
24770 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68  pen() call on th
24780 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c  e same path will
24790 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a   also fail..  **
247a0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
247b0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
247c0 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74  curs in the stat
247d0 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74  () call here, it
247e0 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64   is.  ** ignored
247f0 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72   and -1 is retur
24800 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
24810 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e  will try to open
24820 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a   a new file.  **
24830 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74   descriptor on t
24840 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61  he same path, fa
24850 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  il, and return a
24860 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
24870 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65  e..  **.  ** Eve
24880 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  n if a subsequen
24890 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f  t open() call do
248a0 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20  es succeed, the 
248b0 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a  consequences of.
248c0 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69    ** not searchi
248d0 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62  ng for a resusab
248e0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
248f0 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
24900 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74    */.  if( 0==st
24910 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
24920 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
24930 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
24940 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
24950 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
24960 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
24970 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
24980 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
24990 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
249a0 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
249b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
249c0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
249d0 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
249e0 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
249f0 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
24a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24a10 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
24a20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
24a30 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
24a40 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
24a50 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
24a60 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
24a70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
24a80 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
24a90 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
24aa0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
24ab0 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
24ac0 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
24ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
24ae0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
24af0 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
24b00 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
24b10 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
24b20 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
24b30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24b40 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
24b50 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
24b60 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
24b70 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
24b80 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
24b90 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
24ba0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
24bb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24bc0 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
24bd0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
24be0 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
24bf0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
24c00 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
24c10 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
24c20 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
24c30 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
24c40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
24c50 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
24c60 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
24c70 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
24c80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24c90 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
24ca0 65 64 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  ed is a temporar
24cb0 79 20 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c  y file, it is al
24cc0 77 61 79 73 20 63 72 65 61 74 65 64 20 77 69 74  ways created wit
24cd0 68 0a 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70  h.** the octal p
24ce0 65 72 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20  ermissions 0600 
24cf0 28 72 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62  (read/writable b
24d00 79 20 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49  y owner only). I
24d10 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
24d20 20 61 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d   a database or m
24d30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
24d40 6c 65 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  le, it is create
24d50 64 20 77 69 74 68 20 74 68 65 20 70 65 72 6d 69  d with the permi
24d60 73 73 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20  ssions .** mask 
24d70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
24d80 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e  ILE_PERMISSIONS.
24d90 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
24da0 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
24db0 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
24dc0 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
24dd0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
24de0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
24df0 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
24e00 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
24e10 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
24e20 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
24e30 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
24e40 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
24e50 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
24e60 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
24e70 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
24e80 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
24e90 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
24ea0 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
24eb0 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
24ec0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
24ed0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
24ee0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
24ef0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
24f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
24f10 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
24f20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
24f30 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
24f40 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
24f50 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f70 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
24f80 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
24f90 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
24fa0 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 20 20 20 20  ode_t *pMode    
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24fc0 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
24fd0 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
24fe0 77 69 74 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  with */.){.  int
24ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25010 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
25020 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
25030 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
25040 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25050 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
25060 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
25070 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
25080 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
25090 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
250a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
250b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
250c0 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
250d0 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
250e0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
250f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25100 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
25110 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
25120 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
25130 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
25140 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
25150 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
25160 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
25170 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
25180 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
25190 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
251a0 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
251b0 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
251c0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
251d0 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
251e0 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
251f0 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
25200 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
25210 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
25220 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
25230 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
25240 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 2d 4e 4e 4e   db>-journal-NNN
25250 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
25260 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 2d 4e 4e  th to db>-wal-NN
25270 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NN".    **.    *
25280 2a 20 77 68 65 72 65 20 4e 4e 4e 4e 20 69 73 20  * where NNNN is 
25290 61 20 34 20 64 69 67 69 74 20 64 65 63 69 6d 61  a 4 digit decima
252a0 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
252b0 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
252c0 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
252d0 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
252e0 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
252f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
25300 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
25310 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
25320 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
25330 30 20 26 26 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 && zPath[nDb]!
25340 3d 27 6c 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  ='l' ) nDb--;.  
25350 20 20 6e 44 62 20 2d 3d 20 28 28 66 6c 61 67 73    nDb -= ((flags
25360 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57   & SQLITE_OPEN_W
25370 41 4c 29 20 3f 20 33 20 3a 20 37 29 3b 0a 20 20  AL) ? 3 : 7);.  
25380 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
25390 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
253a0 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
253b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 61 74  .    if( 0==stat
253c0 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
253d0 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
253e0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
253f0 30 37 37 37 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0777;.    }else{
25400 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25410 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
25420 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
25430 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25440 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
25450 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
25460 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73  e = 0600;.  }els
25470 65 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  e{.    *pMode = 
25480 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
25490 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b  ILE_PERMISSIONS;
254a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
254b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
254c0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
254d0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
254e0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
254f0 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
25500 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
25510 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
25520 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
25530 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
25540 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
25550 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
25560 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
25570 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
25580 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
25590 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
255a0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
255b0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
255c0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
255d0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
255e0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
255f0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
25600 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
25610 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
25620 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
25630 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
25640 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
25650 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
25660 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
25670 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
25680 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
25690 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
256a0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
256b0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
256c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
256d0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
256e0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
256f0 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
25700 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
25710 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
25720 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
25730 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
25740 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
25750 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
25760 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
25770 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
25780 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
25790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
257a0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
257b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
257c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
257d0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
257e0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
257f0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
25800 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
25810 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
25820 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
25830 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
25840 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
25850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25860 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
25870 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
25880 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
258b0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
258c0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
258d0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
258e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
258f0 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
25900 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
25910 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
25920 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
25930 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
25940 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
25950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25960 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
25970 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
25980 29 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  ) */.  int dirfd
25990 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
259a0 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
259b0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
259c0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  or */.  int open
259d0 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
259e0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
259f0 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
25a00 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  ) */.  int eType
25a10 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
25a20 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
25a30 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
25a40 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20  .  int noLock;  
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
25a70 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  t locking primit
25a80 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ives */.  int rc
25a90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
25aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
25ab0 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
25ac0 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63   */..  int isExc
25ad0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
25ae0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
25af0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
25b00 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
25b10 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25b20 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
25b30 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
25b40 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
25b50 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
25b60 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
25b70 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
25b80 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
25b90 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
25ba0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
25bb0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
25bc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25bd0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
25be0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
25bf0 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50  LE.  int isAutoP
25c00 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26  roxy  = (flags &
25c10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
25c20 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a  OPROXY);.#endif.
25c30 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
25c40 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
25c50 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
25c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
25c70 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
25c80 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
25c90 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
25ca0 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
25cb0 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
25cc0 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
25cd0 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
25ce0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
25cf0 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
25d00 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
25d10 2f 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69  /.  int isOpenDi
25d20 72 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65  rectory = (isCre
25d30 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
25d40 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25d50 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
25d60 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
25d70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
25d80 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
25d90 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
25da0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
25db0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
25dc0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
25dd0 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
25de0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
25df0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
25e00 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
25e10 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
25e20 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
25e30 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
25e40 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
25e50 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
25e60 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
25e70 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
25e80 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
25e90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
25ea0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
25eb0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
25ec0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
25ed0 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
25ee0 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
25ef0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
25f00 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
25f10 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
25f20 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
25f30 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
25f40 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
25f50 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
25f60 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
25f70 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
25f80 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
25f90 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
25fa0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
25fb0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
25fc0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
25fd0 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
25fe0 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
25ff0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
26000 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
26010 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
26020 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
26030 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
26040 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
26050 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
26060 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
26070 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
26080 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
26090 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
260a0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
260b0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
260c0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
260d0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
260e0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
260f0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
26100 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
26110 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
26120 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
26130 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
26140 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
26150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
26160 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
26170 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
26180 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
26190 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
261a0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
261b0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
261c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
261d0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
261e0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
261f0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
26200 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
26210 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
26220 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
26230 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
26240 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
26250 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
26260 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
26270 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
26280 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
26290 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
262a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
262b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
262c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
262d0 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
262e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
262f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
26300 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
26310 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
26320 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
26330 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
26340 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
26350 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
26360 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
26370 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
26380 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
26390 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
263a0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
263b0 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
263c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
263d0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
263e0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
263f0 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
26400 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
26410 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
26420 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
26430 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
26440 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
26450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26460 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
26470 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
26480 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
26490 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
264a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
264b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
264c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
264d0 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
264e0 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
264f0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
26500 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
26510 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
26520 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
26530 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
26540 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
26550 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
26560 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
26570 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
26580 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
26590 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  NAME+1, zTmpname
265a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
265b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
265c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
265d0 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
265e0 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
265f0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
26600 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c   value of the fl
26610 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61  ags parameter pa
26620 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75  ssed to POSIX fu
26630 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  nction.  ** open
26640 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62  (). These must b
26650 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65  e calculated eve
26660 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e  n if open() is n
26670 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20  ot called, as.  
26680 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73  ** they may be s
26690 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
266a0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
266b0 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65   and used by the
266c0 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69   .  ** 'conch fi
266d0 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63  le' locking func
266e0 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20  tions later on. 
266f0 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64   */.  if( isRead
26700 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67  only )  openFlag
26710 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
26720 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
26730 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
26740 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73  O_RDWR;.  if( is
26750 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e  Create )    open
26760 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54  Flags |= O_CREAT
26770 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  ;.  if( isExclus
26780 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ive ) openFlags 
26790 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  |= (O_EXCL|O_NOF
267a0 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c  OLLOW);.  openFl
267b0 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46  ags |= (O_LARGEF
267c0 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a  ILE|O_BINARY);..
267d0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
267e0 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64    mode_t openMod
267f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26800 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  /* Permissions t
26810 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69  o create file wi
26820 74 68 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  th */.    rc = f
26830 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
26840 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
26850 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20  &openMode);.    
26860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26870 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
26880 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29  t( !p->pUnused )
26890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
268a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
268b0 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d  EN_WAL || eType=
268c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
268d0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20  N_JOURNAL );.   
268e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
268f0 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 6f 70 65    }.    fd = ope
26900 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
26910 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
26920 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
26930 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
26940 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
26950 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
26960 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
26970 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
26980 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
26990 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
269a0 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20     /* Failed to 
269b0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f  open the file fo
269c0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
269d0 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e  ess. Try read-on
269e0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61  ly. */.      fla
269f0 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
26a00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
26a10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
26a20 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  );.      openFla
26a30 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
26a40 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66  _CREAT);.      f
26a50 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
26a60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
26a70 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
26a80 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20   O_RDONLY;.     
26a90 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65   fd = open(zName
26aa0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
26ab0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
26ac0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
26ad0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
26ae0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
26af0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
26b00 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
26b10 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
26b20 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
26b30 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
26b40 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
26b50 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
26b60 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
26b70 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75  }..  if( p->pUnu
26b80 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55  sed ){.    p->pU
26b90 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
26ba0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
26bb0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
26bc0 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65   }..  if( isDele
26bd0 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
26be0 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
26bf0 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
26c00 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b    unlink(zName);
26c10 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
26c20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
26c30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
26c40 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
26c50 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
26c60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
26c70 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74  if( isOpenDirect
26c80 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ory ){.    rc = 
26c90 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
26ca0 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
26cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
26cd0 49 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c  It is safe to cl
26ce0 6f 73 65 20 66 64 20 61 74 20 74 68 69 73 20 70  ose fd at this p
26cf0 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74  oint, because it
26d00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
26d10 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  ot.      ** to b
26d20 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
26d30 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
26d40 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20   were open on a 
26d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20  database file,. 
26d60 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64       ** it would
26d70 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
26d80 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f  close as this wo
26d90 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20  uld release any 
26da0 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20  locks held.     
26db0 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20   ** on the file 
26dc0 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
26dd0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
26de0 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
26df0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
26e00 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
26e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26e20 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
26e30 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
26e40 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
26e50 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
26e60 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
26e70 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
26e80 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  EC.  fcntl(fd, F
26e90 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
26ea0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
26eb0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
26ec0 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
26ed0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
26ee0 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
26ef0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
26f00 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
26f10 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
26f20 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
26f30 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
26f40 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
26f50 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
26f60 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
26f70 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
26f80 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
26f90 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20   if( dirfd>=0 ) 
26fa0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
26fb0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
26fc0 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
26fd0 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66 64   */.    close(fd
26fe0 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
26ff0 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20  eak if fail, in 
27000 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
27010 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27020 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
27030 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
27040 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
27050 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
27060 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
27070 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
27080 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
27090 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
270a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69    }.#endif.  .#i
270b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
270c0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
270d0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
270e0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
270f0 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
27100 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
27110 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
27120 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
27130 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
27140 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
27150 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
27160 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
27170 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
27180 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
27190 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
271a0 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
271b0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
271c0 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
271d0 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
271e0 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
271f0 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
27200 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
27210 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
27220 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
27230 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
27240 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
27250 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
27260 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
27270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27280 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
27290 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  sInfo;.      if(
272a0 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
272b0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
272c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
272d0 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
272e0 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
272f0 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
27300 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
27310 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
27320 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
27330 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
27340 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
27350 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
27360 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
27370 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
27380 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
27390 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
273a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
273b0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
273c0 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
273d0 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
273e0 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
273f0 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
27400 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
27410 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
27420 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
27430 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
27440 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
27450 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
27460 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
27470 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
27480 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
27490 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
274a0 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
274b0 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
274c0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
274d0 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a  if( dirfd>=0 ){.
274e0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
274f0 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
27500 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
27510 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
27520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27530 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
27540 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
27550 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
27560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27570 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
27580 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
27590 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
275a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
275b0 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
275c0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
275d0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
275e0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
275f0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
27600 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
27610 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
27620 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20   zPath, noLock, 
27630 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  isDelete);.     
27640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
27660 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
27670 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
27680 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
27690 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
276a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
276b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
276c0 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
276d0 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
276e0 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
276f0 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
27700 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
27710 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
27720 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
27730 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
27740 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
27750 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
27760 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
27770 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
27780 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
27790 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
277a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
277b0 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
277c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
277d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
277e0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
277f0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
27800 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
27810 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
27820 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
27830 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
27840 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
27850 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e   isDelete);.open
27860 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
27870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
27890 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
278a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
278b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
278c0 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
278d0 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
278e0 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
278f0 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
27900 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
27910 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
27920 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
27930 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
27940 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
27950 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
27960 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
27970 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
27980 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
27990 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
279a0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
279b0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
279c0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
279d0 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
279e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
279f0 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
27a00 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
27a10 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
27a20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27a30 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
27a40 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
27a50 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
27a60 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
27a70 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
27a80 0a 20 20 69 66 28 20 75 6e 6c 69 6e 6b 28 7a 50  .  if( unlink(zP
27a90 61 74 68 29 3d 3d 28 2d 31 29 20 26 26 20 65 72  ath)==(-1) && er
27aa0 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
27ab0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
27ac0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
27ad0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
27ae0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
27af0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
27b00 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
27b10 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
27b20 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
27b30 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
27b40 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
27b50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
27b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
27b70 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
27b80 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
27b90 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
27ba0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
27bb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
27bc0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
27bd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
27be0 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
27bf0 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
27c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27c10 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26 26 21  if( close(fd)&&!
27c20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  rc ){.        rc
27c30 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
27c40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
27c50 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
27c60 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d   zPath);.      }
27c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
27c80 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
27c90 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
27ca0 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
27cb0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
27cc0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
27cd0 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
27ce0 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
27cf0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
27d00 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
27d10 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
27d20 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
27d30 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
27d40 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
27d50 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
27d60 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
27d70 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
27d80 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
27d90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
27da0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
27db0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
27dc0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
27dd0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
27de0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
27df0 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
27e00 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
27e10 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
27e20 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
27e30 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
27e40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
27e50 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
27e60 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
27e70 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
27e80 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
27e90 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
27ea0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
27eb0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
27ec0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
27ed0 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
27ee0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
27ef0 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
27f00 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
27f10 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
27f20 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
27f30 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
27f40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
27f50 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
27f60 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
27f70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
27f80 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
27f90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
27fa0 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
27fb0 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
27fc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
27fd0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
27fe0 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
27ff0 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
28000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28010 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28020 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
28030 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
28040 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
28050 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
28060 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
28070 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
28080 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
28090 74 20 3d 20 28 61 63 63 65 73 73 28 7a 50 61 74  t = (access(zPat
280a0 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
280b0 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
280c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
280d0 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
280e0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
280f0 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
28100 73 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66  stat(zPath, &buf
28110 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65  ) && buf.st_size
28120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ==0 ){.      *pR
28130 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d  esOut = 0;.    }
28140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
28150 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
28160 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
28170 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
28180 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
28190 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
281a0 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
281b0 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
281c0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
281d0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
281e0 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
281f0 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
28200 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
28210 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
28220 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
28230 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
28240 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
28250 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
28260 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
28270 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
28280 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
28290 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
282a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
282b0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
282c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
282d0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
282e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
282f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
28300 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
28310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
28320 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
28330 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
28340 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28360 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
28370 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
28380 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
283b0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20  fer */.){..  /* 
283c0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
283d0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
283e0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
283f0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
28400 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
28410 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
28420 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
28430 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
28440 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
28450 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
28460 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
28470 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
28480 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
28490 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
284a0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
284b0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
284c0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
284d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
284e0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
284f0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
28500 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
28510 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
28520 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
28530 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  s);..  zOut[nOut
28540 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  -1] = '\0';.  if
28550 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20  ( zPath[0]=='/' 
28560 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
28570 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
28580 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29  ut, "%s", zPath)
28590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
285a0 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28  nt nCwd;.    if(
285b0 20 67 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f   getcwd(zOut, nO
285c0 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1)==0 ){.    
285d0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
285e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
285f0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74  TOPEN_BKPT, "get
28600 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  cwd", zPath);.  
28610 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28    }.    nCwd = (
28620 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29  int)strlen(zOut)
28630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
28640 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64  printf(nOut-nCwd
28650 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22  , &zOut[nCwd], "
28660 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  /%s", zPath);.  
28670 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
28680 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  E_OK;.}...#ifnde
28690 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
286a0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
286b0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
286c0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
286d0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
286e0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
286f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
28700 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
28710 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
28720 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
28730 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
28740 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
28750 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
28760 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
28770 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
28780 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
28790 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
287a0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
287b0 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
287c0 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
287d0 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
287e0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
287f0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
28800 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
28810 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
28820 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
28830 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
28840 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
28850 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
28860 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
28870 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
28880 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
28890 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
288a0 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
288b0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
288c0 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
288d0 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
288e0 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
288f0 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
28900 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
28910 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
28920 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
28930 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
28940 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
28950 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
28960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
28970 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28980 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
28990 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
289a0 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
289b0 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
289c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
289d0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
289e0 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
289f0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
28a00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
28a10 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
28a20 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
28a30 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
28a40 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
28a50 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
28a60 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
28a70 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
28a80 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
28a90 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
28aa0 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
28ab0 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
28ac0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
28ad0 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
28ae0 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
28af0 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
28b00 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
28b10 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
28b20 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
28b30 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
28b40 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
28b50 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
28b60 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
28b70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
28b80 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
28b90 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
28ba0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
28bb0 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
28bc0 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
28bd0 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
28be0 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
28bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
28c00 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
28c10 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
28c20 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
28c30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
28c40 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
28c50 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
28c60 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
28c70 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
28c80 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
28c90 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
28ca0 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
28cb0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
28cc0 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
28cd0 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
28ce0 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
28cf0 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
28d00 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
28d10 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
28d20 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
28d30 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
28d40 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
28d50 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
28d60 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
28d70 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
28d80 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
28d90 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
28da0 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
28db0 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
28dc0 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
28dd0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
28de0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28df0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
28e00 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
28e10 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
28e20 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
28e30 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
28e40 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
28e50 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
28e60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
28e70 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
28e80 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
28e90 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
28ea0 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
28eb0 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
28ec0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
28ed0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
28ee0 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
28ef0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
28f00 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
28f10 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
28f20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
28f30 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
28f40 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
28f50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
28f60 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
28f70 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
28f80 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
28f90 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
28fa0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
28fb0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
28fc0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
28fd0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28fe0 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
28ff0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
29000 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
29010 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
29020 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
29030 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
29040 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
29050 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
29060 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
29070 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
29080 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
29090 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
290a0 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
290b0 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
290c0 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
290d0 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
290e0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
290f0 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
29100 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
29110 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
29120 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
29130 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
29140 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
29150 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
29160 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
29170 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
29180 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
29190 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
291a0 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
291b0 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
291c0 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
291d0 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
291e0 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
291f0 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
29200 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
29210 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
29220 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
29230 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
29240 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
29250 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
29260 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
29270 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
29280 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
29290 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
292a0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
292b0 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
292c0 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
292d0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
292e0 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
292f0 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
29300 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
29310 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
29320 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
29330 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
29340 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
29350 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
29360 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
29370 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
29380 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
29390 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
293a0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
293b0 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  pid));.      ass
293c0 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
293d0 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a  izeof(pid)<=(siz
293e0 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
293f0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
29400 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29  t) + sizeof(pid)
29410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29420 20 20 20 64 6f 7b 20 6e 42 75 66 20 3d 20 72 65     do{ nBuf = re
29430 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75  ad(fd, zBuf, nBu
29440 66 29 3b 20 7d 77 68 69 6c 65 28 20 6e 42 75 66  f); }while( nBuf
29450 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
29460 54 52 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  TR );.      clos
29470 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
29480 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29490 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   nBuf;.}.../*.**
294a0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
294b0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
294c0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
294d0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
294e0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
294f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
29500 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61  croseconds we wa
29510 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20  nt to sleep..** 
29520 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29530 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29540 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f  f microseconds o
29550 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79  f sleep actually
29560 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72  .** requested fr
29570 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  om the underlyin
29580 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
29590 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69  em, a number whi
295a0 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67  ch.** might be g
295b0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
295c0 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75  qual to the argu
295d0 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65  ment, but not le
295e0 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61  ss.** than the a
295f0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
29600 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70  ic int unixSleep
29610 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
29620 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f  tUsed, int micro
29630 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53  seconds){.#if OS
29640 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
29650 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a  t timespec sp;..
29660 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69    sp.tv_sec = mi
29670 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  croseconds / 100
29680 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73  0000;.  sp.tv_ns
29690 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ec = (microsecon
296a0 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20  ds % 1000000) * 
296b0 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65  1000;.  nanoslee
296c0 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20  p(&sp, NULL);.  
296d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
296e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
296f0 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  urn microseconds
29700 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
29710 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
29720 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
29730 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64  leep(microsecond
29740 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
29750 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
29760 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
29770 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20  econds;.#else.  
29780 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d  int seconds = (m
29790 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39  icroseconds+9999
297a0 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73  99)/1000000;.  s
297b0 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20  leep(seconds);. 
297c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
297d0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
297e0 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30  turn seconds*100
297f0 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  0000;.#endif.}..
29800 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
29810 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
29820 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
29830 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
29840 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
29850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
29860 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
29870 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
29880 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
29890 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
298a0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
298b0 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
298c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
298d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
298e0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
298f0 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
29900 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
29910 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
29920 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
29930 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29940 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
29950 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
29960 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
29970 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
29980 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
29990 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
299a0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
299b0 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
299c0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
299d0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
299e0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
299f0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
29a00 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
29a10 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
29a20 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
29a30 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
29a40 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
29a50 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
29a60 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
29a70 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
29a80 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
29a90 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
29aa0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
29ab0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
29ac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29ad0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
29ae0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
29af0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69  s *NotUsed, sqli
29b00 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
29b10 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
29b20 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
29b30 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
29b40 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
29b50 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
29b60 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54   defined(NO_GETT
29b70 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  OD).  time_t t;.
29b80 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
29b90 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33  iNow = ((sqlite3
29ba0 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b  _int64)t)*1000 +
29bb0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69   unixEpoch;.#eli
29bc0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
29bd0 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
29be0 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74  Now;.  clock_get
29bf0 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54  time(CLOCK_REALT
29c00 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a  IME, &sNow);.  *
29c10 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
29c20 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
29c30 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
29c40 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73  sec + sNow.tv_ns
29c50 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73  ec/1000000;.#els
29c60 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
29c70 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
29c80 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
29c90 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
29ca0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
29cb0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
29cc0 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
29cd0 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23  .tv_usec/1000;.#
29ce0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
29cf0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
29d00 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
29d10 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
29d20 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
29d30 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
29d40 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
29d50 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
29d60 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
29d70 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
29d80 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
29d90 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
29da0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
29db0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
29dc0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
29dd0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
29de0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
29df0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
29e00 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
29e10 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
29e20 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
29e30 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
29e40 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
29e50 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
29e60 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
29e70 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
29e80 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
29e90 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c  e *prNow){.  sql
29ea0 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
29eb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29ec0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
29ed0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
29ee0 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e  4(0, &i);.  *prN
29ef0 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
29f00 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  0;.  return 0;.}
29f10 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
29f20 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
29f30 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
29f40 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
29f50 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
29f60 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
29f70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
29f80 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
29f90 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
29fa0 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
29fb0 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
29fc0 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
29fd0 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
29fe0 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
29ff0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
2a000 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
2a010 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2a020 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
2a030 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
2a040 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
2a050 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
2a060 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2a070 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2a080 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
2a090 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
2a0a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a0b0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2a0c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a0d0 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
2a0e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2a0f0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
2a100 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
2a110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a120 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
2a130 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2a140 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2a150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2a160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a210 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
2a220 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
2a230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2a250 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
2a260 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
2a270 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
2a280 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
2a290 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
2a2a0 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
2a2b0 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
2a2c0 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
2a2d0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
2a2e0 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
2a2f0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
2a300 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
2a310 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
2a320 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
2a330 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2a340 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2a350 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
2a360 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
2a370 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
2a380 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
2a390 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
2a3a0 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
2a3b0 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
2a3c0 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
2a3d0 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
2a3e0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2a3f0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
2a400 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
2a410 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
2a420 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2a430 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
2a440 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
2a450 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
2a460 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
2a470 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
2a480 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
2a490 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
2a4a0 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
2a4b0 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
2a4c0 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
2a4d0 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
2a4e0 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
2a4f0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
2a500 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
2a510 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
2a520 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
2a530 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
2a540 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
2a550 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
2a560 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
2a570 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
2a580 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
2a590 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
2a5a0 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
2a5b0 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
2a5c0 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
2a5d0 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
2a5e0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
2a5f0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
2a600 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
2a610 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
2a620 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
2a630 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
2a640 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
2a650 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
2a660 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
2a670 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
2a680 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
2a690 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
2a6a0 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
2a6b0 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
2a6c0 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
2a6d0 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
2a6e0 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
2a6f0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
2a700 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
2a710 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
2a720 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
2a730 34 30 30 30 30 30 30 30 09 09 20 20 20 09 0a 2a  40000000..   ..*
2a740 2a 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f  *      RESERVED_
2a750 42 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30  BYTE       0x400
2a760 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48  00001.**      SH
2a770 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20  ARED_RANGE      
2a780 20 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20    0x40000002 -> 
2a790 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a  0x40000200.**.**
2a7a0 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c   This works well
2a7b0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
2a7c0 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73  le system, but s
2a7d0 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30  hows a nearly 10
2a7e0 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69  0x.** slowdown i
2a7f0 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e  n read performan
2a800 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73  ce on AFP becaus
2a810 65 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74  e the AFP client
2a820 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65   disables.** the
2a830 20 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e   read cache when
2a840 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2a850 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20  s are present.  
2a860 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61  Enabling the rea
2a870 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73  d.** cache expos
2a880 65 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72  es a cache coher
2a890 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61  ency problem tha
2a8a0 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20  t is present on 
2a8b0 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70  all OS X.** supp
2a8c0 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69  orted network fi
2a8d0 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53  le systems.  NFS
2a8e0 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62   and AFP both ob
2a8f0 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f  serve the.** clo
2a900 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e  se-to-open seman
2a910 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e  tics for ensurin
2a920 67 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  g cache coherenc
2a930 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73  y.** [http://nfs
2a940 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  .sourceforge.net
2a950 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68  /#faq_a8], which
2a960 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74   does not effect
2a970 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73  ively.** address
2a980 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
2a990 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74  s for concurrent
2a9a0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2a9b0 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   by multiple.** 
2a9c0 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2a9d0 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77  ers.** [http://w
2a9e0 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51  ww.nabble.com/SQ
2a9f0 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68  Lite-on-NFS-cach
2aa00 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35  e-coherency-td15
2aa10 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a  655701.html]..**
2aa20 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74  .** To address t
2aa30 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61  he performance a
2aa40 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e  nd cache coheren
2aa50 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79  cy issues, proxy
2aa60 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
2aa70 20 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79   changes the way
2aa80 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2aa90 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62   is controlled b
2aaa0 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73  y limiting acces
2aab0 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65  s to a.** single
2aac0 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20   host at a time 
2aad0 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20  and moving file 
2aae0 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65  locks off of the
2aaf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
2ab00 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f  * and onto a pro
2ab10 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c  xy file on the l
2ab20 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
2ab30 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69  .  .**.**.** Usi
2ab40 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a  ng proxy locks.*
2ab50 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
2ab60 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73  ---.**.** C APIs
2ab70 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  .**.**  sqlite3_
2ab80 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
2ab90 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
2aba0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2abb0 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
2abd0 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
2abe0 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
2abf0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
2ac00 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
2ac10 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
2ac20 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74  ILE, &<proxy_pat
2ac30 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
2ac40 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
2ac50 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2ac60 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2ac70 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
2ac80 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
2ac90 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
2aca0 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
2acb0 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
2acc0 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
2acd0 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
2ace0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
2acf0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
2ad00 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
2ad10 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
2ad20 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2ad30 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
2ad40 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
2ad50 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
2ad60 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
2ad70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
2ad80 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
2ad90 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
2ada0 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
2adb0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
2adc0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
2add0 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
2ade0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
2adf0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
2ae00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2ae10 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
2ae20 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
2ae30 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
2ae40 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
2ae50 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
2ae60 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
2ae70 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
2ae80 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
2ae90 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
2aea0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
2aeb0 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
2aec0 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
2aed0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
2aee0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
2aef0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
2af00 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
2af10 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
2af20 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
2af30 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
2af40 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
2af50 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
2af60 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
2af70 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
2af80 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
2af90 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
2afa0 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
2afb0 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
2afc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2afd0 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
2afe0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
2aff0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
2b000 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
2b010 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
2b020 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
2b030 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
2b040 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b050 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
2b060 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
2b070 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
2b080 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
2b090 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
2b0a0 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
2b0b0 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
2b0c0 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
2b0d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
2b0e0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
2b0f0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
2b100 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
2b110 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
2b120 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
2b130 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
2b140 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
2b150 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
2b160 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
2b170 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
2b180 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
2b190 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
2b1a0 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
2b1b0 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
2b1c0 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
2b1d0 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
2b1e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
2b1f0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
2b200 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
2b210 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
2b220 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
2b230 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2b240 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
2b250 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
2b260 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
2b270 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
2b280 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
2b290 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
2b2a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
2b2b0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
2b2c0 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f  it's contents do
2b2d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
2b2e0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
2b2f0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
2b300 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
2b310 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
2b320 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
2b330 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
2b340 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
2b350 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
2b360 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
2b370 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
2b380 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
2b390 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
2b3a0 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
2b3b0 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
2b3c0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
2b3d0 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
2b3e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
2b3f0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2b400 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
2b410 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
2b420 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2b430 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2b440 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
2b450 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
2b460 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
2b470 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
2b480 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
2b490 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2b4a0 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
2b4b0 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
2b4c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2b4d0 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
2b4e0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
2b4f0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
2b500 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
2b510 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
2b520 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
2b530 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
2b540 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
2b550 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
2b560 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
2b570 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
2b580 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
2b590 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
2b5a0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
2b5b0 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
2b5c0 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
2b5d0 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
2b5e0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
2b5f0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
2b600 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
2b610 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
2b620 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
2b630 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
2b640 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
2b650 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
2b660 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
2b670 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
2b680 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
2b690 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
2b6a0 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
2b6b0 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
2b6c0 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
2b6d0 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
2b6e0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
2b6f0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
2b700 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
2b710 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
2b720 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
2b730 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
2b740 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
2b750 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
2b760 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
2b770 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
2b780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2b790 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
2b7a0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2b7b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
2b7c0 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
2b7d0 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
2b7e0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
2b7f0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
2b800 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
2b810 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
2b820 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
2b830 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
2b840 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2b850 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
2b860 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
2b870 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
2b880 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
2b890 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
2b8a0 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
2b8b0 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
2b8c0 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
2b8d0 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
2b8e0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
2b8f0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
2b900 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
2b910 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
2b920 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
2b930 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
2b940 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
2b950 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
2b960 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
2b970 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
2b980 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
2b990 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
2b9a0 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
2b9b0 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
2b9c0 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
2b9d0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
2b9e0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
2b9f0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
2ba00 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
2ba10 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
2ba20 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
2ba30 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
2ba40 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
2ba50 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
2ba60 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
2ba70 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
2ba80 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
2ba90 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
2baa0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
2bab0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
2bac0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
2bad0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
2bae0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
2baf0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
2bb00 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
2bb10 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
2bb20 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
2bb30 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2bb40 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
2bb50 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
2bb60 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
2bb70 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
2bb80 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
2bb90 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
2bba0 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67  xplicity calling
2bbb0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f   the SQLITE_SET_
2bbc0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
2bbd0 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
2bbe0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
2bbf0 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
2bc00 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
2bc10 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2bc20 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
2bc30 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
2bc40 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
2bc50 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
2bc60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2bc70 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2bc80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2bc90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
2bca0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
2bcb0 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
2bcc0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
2bcd0 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
2bce0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
2bcf0 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
2bd00 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2bd10 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
2bd20 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
2bd30 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
2bd40 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
2bd50 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
2bd60 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
2bd70 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
2bd80 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
2bd90 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
2bda0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
2bdb0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
2bdc0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2bdd0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
2bde0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2bdf0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2be00 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
2be10 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
2be20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2be30 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
2be40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
2be50 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
2be60 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2be70 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
2be80 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bea0 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
2beb0 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
2bec0 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69  ockless */.  voi
2bed0 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e  d *oldLockingCon
2bee0 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69  text;     /* Ori
2bef0 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e  ginal lockingcon
2bf00 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20  text to restore 
2bf10 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71  on close */.  sq
2bf20 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2bf30 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68   const *pOldMeth
2bf40 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  od;     /* Origi
2bf50 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  nal I/O methods 
2bf60 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a  for close */.};.
2bf70 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ./* .** The prox
2bf80 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  y lock file path
2bf90 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2bfa0 65 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77  e at dbPath is w
2bfb0 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74  ritten into lPat
2bfc0 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73  h, .** which mus
2bfd0 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64  t point to valid
2bfe0 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  , writable memor
2bff0 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  y large enough f
2c000 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67  or a maxLen leng
2c010 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e  th.** file path.
2c020 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2c030 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
2c040 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50  (const char *dbP
2c050 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68  ath, char *lPath
2c060 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29  , size_t maxLen)
2c070 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69  {.  int len;.  i
2c080 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20  nt dbLen;.  int 
2c090 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50  i;..#ifdef LOCKP
2c0a0 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20  ROXYDIR.  len = 
2c0b0 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c  strlcpy(lPath, L
2c0c0 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78  OCKPROXYDIR, max
2c0d0 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66  Len);.#else.# if
2c0e0 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55  def _CS_DARWIN_U
2c0f0 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b  SER_TEMP_DIR.  {
2c100 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74  .    if( !confst
2c110 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2c120 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74  R_TEMP_DIR, lPat
2c130 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20  h, maxLen) ){.  
2c140 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45      OSTRACE(("GE
2c150 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65  TLOCKPATH  faile
2c160 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69  d %s errno=%d pi
2c170 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
2c180 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65          lPath, e
2c190 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 29  rrno, getpid()))
2c1a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2c1b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
2c1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
2c1d0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
2c1e0 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
2c1f0 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20   maxLen);    .  
2c200 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
2c210 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
2c220 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
2c230 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
2c240 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
2c250 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
2c260 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
2c270 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
2c280 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
2c290 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
2c2a0 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
2c2b0 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
2c2c0 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73    dbLen = (int)s
2c2d0 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20  trlen(dbPath);. 
2c2e0 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c   for( i=0; i<dbL
2c2f0 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c  en && (i+len+7)<
2c300 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b  (int)maxLen; i++
2c310 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
2c320 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
2c330 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
2c340 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
2c350 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
2c360 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
2c370 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
2c380 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
2c390 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
2c3a0 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2c3b0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2c3c0 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28  , lPath, getpid(
2c3d0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )));.  return SQ
2c3e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
2c3f0 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20   ** Creates the 
2c400 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e  lock file and an
2c410 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74  y missing direct
2c420 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74  ories in lockPat
2c430 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h. */.static int
2c440 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2c450 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2c460 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e  *lockPath){.  in
2c470 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72  t i, len;.  char
2c480 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d   buf[MAXPATHLEN]
2c490 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20  ;.  int start = 
2c4a0 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c  0;.  .  assert(l
2c4b0 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a  ockPath!=NULL);.
2c4c0 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61    /* try to crea
2c4d0 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72  te all the inter
2c4e0 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72  mediate director
2c4f0 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28  ies */.  len = (
2c500 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50  int)strlen(lockP
2c510 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d  ath);.  buf[0] =
2c520 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20   lockPath[0];.  
2c530 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b  for( i=1; i<len;
2c540 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20   i++ ){.    if( 
2c550 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27  lockPath[i] == '
2c560 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74  /' && (i - start
2c570 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f   > 0) ){.      /
2c580 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20  * only mkdir if 
2c590 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20  leaf dir != "." 
2c5a0 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a  or "/" or ".." *
2c5b0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74  /.      if( i-st
2c5c0 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72  art>2 || (i-star
2c5d0 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72  t==1 && buf[star
2c5e0 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
2c5f0 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20  [start] != '/') 
2c600 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d  .         || (i-
2c610 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b  start==2 && buf[
2c620 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
2c630 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d   buf[start+1] !=
2c640 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20   '.') ){.       
2c650 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20   buf[i]='\0';.  
2c660 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72 28        if( mkdir(
2c670 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  buf, SQLITE_DEFA
2c680 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
2c690 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
2c6a0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
2c6b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
2c6c0 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
2c6d0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2c6e0 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
2c6f0 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44  LOCKPATH  FAILED
2c700 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a   creating %s, ".
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79       "'%s' proxy
2c730 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2c740 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
2c760 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  f, strerror(err)
2c770 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
2c780 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20  id()));.        
2c790 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a      return err;.
2c7a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c7c0 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20      start=i+1;. 
2c7d0 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20     }.    buf[i] 
2c7e0 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20  = lockPath[i];. 
2c7f0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43   }.  OSTRACE(("C
2c800 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70  REATELOCKPATH  p
2c810 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2c820 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63  s pid=%d\n", loc
2c830 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2c840 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
2c850 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2c860 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65   new VFS file de
2c870 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64  scriptor (stored
2c880 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2c890 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
2c8a0 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20  te3_malloc) and 
2c8b0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61  open the file na
2c8c0 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68  med "path" in th
2c8d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2c8e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2c8f0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
2c900 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20  le not only for 
2c910 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65  closing the file
2c920 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62   descriptor.** b
2c930 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65  ut also for free
2c940 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ing the memory a
2c950 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c960 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2c970 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
2c980 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  t proxyCreateUni
2c990 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74  xFile(.    const
2c9a0 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
2c9b0 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20      /* path for 
2c9c0 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  the new unixFile
2c9d0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   */.    unixFile
2c9e0 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20   **ppFile,      
2c9f0 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65   /* unixFile cre
2ca00 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  ated and returne
2ca10 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20  d by ref */.    
2ca20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20  int islockfile  
2ca30 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e           /* if n
2ca40 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20  on zero missing 
2ca50 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65  dirs will be cre
2ca60 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e  ated */.) {.  in
2ca70 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
2ca80 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 75   dirfd = -1;.  u
2ca90 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
2caa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2cab0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46  _OK;.  int openF
2cac0 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
2cad0 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74  O_CREAT;.  sqlit
2cae0 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b  e3_vfs dummyVfs;
2caf0 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20  .  int terrno = 
2cb00 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  0;.  UnixUnusedF
2cb10 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c  d *pUnused = NUL
2cb20 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73  L;..  /* 1. firs
2cb30 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72  t try to open/cr
2cb40 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  eate the file.  
2cb50 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61  ** 2. if that fa
2cb60 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73  ils, and this is
2cb70 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f   a lock file (no
2cb80 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72  t-conch), try cr
2cb90 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
2cba0 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69  parent directori
2cbb0 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20  es and then try 
2cbc0 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69  again..  ** 3. i
2cbd0 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72  f that fails, tr
2cbe0 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69  y to open the fi
2cbf0 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a  le read-only.  *
2cc00 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75  * otherwise retu
2cc10 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b  rn BUSY (if lock
2cc20 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50   file) or CANTOP
2cc30 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  EN for the conch
2cc40 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e   file.  */.  pUn
2cc50 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
2cc60 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e  bleFd(path, open
2cc70 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55  Flags);.  if( pU
2cc80 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20  nused ){.    fd 
2cc90 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2cca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75   }else{.    pUnu
2ccb0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2ccc0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2ccd0 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20  used));.    if( 
2cce0 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
2ccf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cd00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2cd10 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2cd20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
2cd30 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2cd40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2cd50 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2cd60 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2cd70 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
2cd80 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
2cd90 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
2cda0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
2cdb0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
2cdc0 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
2cdd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
2cde0 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f  d = open(path, o
2cdf0 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45  penFlags, SQLITE
2ce00 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2ce10 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20  RMISSIONS);.    
2ce20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ce30 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2ce40 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2ce50 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 6f  ONLY;.    fd = o
2ce60 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2ce70 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2ce80 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2ce90 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2cea0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
2ceb0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2cec0 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
2ced0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2cee0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2cef0 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
2cf00 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
2cf10 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
2cf20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cf30 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
2cf40 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
2cf50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2cf60 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
2cf70 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2cf80 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
2cf90 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2cfa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cfb0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2cfc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
2cfd0 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2cfe0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2cff0 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
2d000 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
2d010 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
2d020 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d030 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
2d040 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
2d050 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
2d060 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2d070 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
2d080 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2d090 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
2d0a0 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
2d0b0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
2d0c0 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
2d0d0 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
2d0e0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
2d0f0 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
2d100 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
2d110 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2d120 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
2d130 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71 6c   fd, dirfd, (sql
2d140 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
2d150 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20 20   path, 0, 0);.  
2d160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d170 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
2d180 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
2d190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d1a0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
2d1b0 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73 65  oxy:    .  close
2d1c0 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c  (fd); /* silentl
2d1d0 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72 72  y leak fd if err
2d1e0 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61 64  or, we're alread
2d1f0 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  y in error */.  
2d200 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2d210 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  w);.  sqlite3_fr
2d220 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72  ee(pUnused);.  r
2d230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2d240 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2d250 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
2d260 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
2d270 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
2d280 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
2d290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  */.int sqlite3_h
2d2a0 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23  ostid_num = 0;.#
2d2b0 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50  endif..#define P
2d2c0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20  ROXY_HOSTIDLEN  
2d2d0 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66    16  /* conch f
2d2e0 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67  ile host id leng
2d2f0 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c  th */../* Not al
2d300 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
2d310 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
2d320 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
2d330 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
2d340 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
2d350 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
2d360 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
2d370 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
2d380 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
2d390 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
2d3a0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
2d3b0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
2d3c0 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
2d3d0 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
2d3e0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2d3f0 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
2d400 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
2d410 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
2d420 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2d430 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
2d440 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
2d450 6f 75 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  out */.  .  asse
2d460 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
2d470 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
2d480 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
2d490 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
2d4a0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
2d4b0 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f  f defined(__MAX_
2d4c0 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e  OS_X_VERSION_MIN
2d4d0 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20  _REQUIRED)\.    
2d4e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f             && __
2d4f0 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
2d500 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30  _MIN_REQUIRED<10
2d510 35 30 0a 20 20 69 66 28 20 67 65 74 68 6f 73 74  50.  if( gethost
2d520 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
2d530 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 69  imeout) ){.    i
2d540 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
2d550 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
2d560 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
2d570 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  = err;.    }.   
2d580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2d590 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OERR;.  }.#endif
2d5a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2d5b0 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
2d5c0 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
2d5d0 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
2d5e0 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
2d5f0 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
2d600 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2d610 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
2d620 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
2d630 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
2d640 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
2d650 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
2d660 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2d670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d680 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
2d690 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
2d6a0 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
2d6b0 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
2d6c0 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
2d6d0 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
2d6e0 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
2d6f0 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
2d700 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
2d710 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
2d720 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
2d730 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
2d740 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
2d750 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
2d760 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
2d770 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
2d780 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
2d790 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
2d7a0 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
2d7b0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2d7c0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
2d7d0 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
2d7e0 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
2d7f0 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
2d800 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
2d810 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
2d820 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
2d830 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
2d840 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
2d850 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
2d860 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
2d870 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
2d880 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
2d890 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
2d8a0 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
2d8b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2d8c0 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
2d8d0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
2d8e0 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
2d8f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
2d900 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
2d910 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
2d920 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
2d930 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2d940 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2d950 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2d960 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2d970 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
2d980 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2d990 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2d9a0 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
2d9b0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
2d9c0 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
2d9d0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
2d9e0 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
2d9f0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
2da00 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
2da10 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
2da20 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
2da30 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
2da40 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
2da50 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
2da60 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   -1;.  UNUSED_PA
2da70 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44  RAMETER(myHostID
2da80 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20  );..  /* create 
2da90 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65  a new path by re
2daa0 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69  place the traili
2dab0 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68  ng '-conch' with
2dac0 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70   '-break' */.  p
2dad0 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79  athLen = strlcpy
2dae0 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d  (tPath, cPath, M
2daf0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66  AXPATHLEN);.  if
2db00 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54  ( pathLen>MAXPAT
2db10 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c  HLEN || pathLen<
2db20 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c  6 || .     (strl
2db30 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c  cpy(&tPath[pathL
2db40 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20  en-5], "break", 
2db50 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20  6) != 5) ){.    
2db60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2db70 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
2db80 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72  errmsg,"path err
2db90 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
2dba0 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  t)pathLen);.    
2dbb0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
2dbc0 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61  ck;.  }.  /* rea
2dbd0 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74  d the conch cont
2dbe0 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e  ent */.  readLen
2dbf0 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69   = pread(conchFi
2dc00 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58  le->h, buf, PROX
2dc10 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
2dc20 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e  );.  if( readLen
2dc30 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  <PROXY_PATHINDEX
2dc40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2dc50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2dc60 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
2dc70 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20  read error (len 
2dc80 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65  %d)",(int)readLe
2dc90 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
2dca0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2dcb0 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
2dcc0 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
2dcd0 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
2dce0 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61  .  fd = open(tPa
2dcf0 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
2dd00 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c  EAT|O_EXCL), SQL
2dd10 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2dd20 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2dd30 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2dd40 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2dd50 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
2dd60 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
2dd70 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2dd80 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2dd90 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2dda0 20 20 7d 0a 20 20 69 66 28 20 70 77 72 69 74 65    }.  if( pwrite
2ddb0 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65  (fd, buf, readLe
2ddc0 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f  n, 0) != (ssize_
2ddd0 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20  t)readLen ){.   
2dde0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ddf0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
2de00 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65  , errmsg, "write
2de10 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
2de20 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
2de30 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2de40 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28   }.  if( rename(
2de50 74 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b  tPath, cPath) ){
2de60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2de70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
2de80 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72  msg), errmsg, "r
2de90 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64  ename failed (%d
2dea0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
2deb0 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
2dec0 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ck;.  }.  rc = 0
2ded0 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
2dee0 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65  rr, "broke stale
2def0 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20   lock on %s\n", 
2df00 63 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73 65 28  cPath);.  close(
2df10 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20  conchFile->h);. 
2df20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
2df30 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
2df40 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
2df50 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
2df60 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
2df70 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2df80 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
2df90 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b    unlink(tPath);
2dfa0 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
2dfb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
2dfc0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
2dfd0 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61  led to break sta
2dfe0 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25  le lock on %s, %
2dff0 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72  s\n", cPath, err
2e000 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  msg);.  }.  retu
2e010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
2e020 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
2e030 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
2e040 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b  h file and break
2e050 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66   a stale lock if
2e060 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64   the .** host id
2e070 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
2e080 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e  tic int proxyCon
2e090 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
2e0a0 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
2e0b0 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63  yHostID, int loc
2e0c0 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c  kType){.  proxyL
2e0d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2e0e0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2e0f0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2e100 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2e110 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
2e120 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2e130 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2e140 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e150 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73  OK;.  int nTries
2e160 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74   = 0;.  struct t
2e170 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64  imespec conchMod
2e180 54 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a  Time;.  .  do {.
2e190 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2e1a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2e1b0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2e1c0 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
2e1d0 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69  kType);.    nTri
2e1e0 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72  es ++;.    if( r
2e1f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
2e200 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
2e210 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62  e lock failed (b
2e220 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31  usy):.       * 1
2e230 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20  st try: get the 
2e240 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20  mod time of the 
2e250 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73  conch, wait 0.5s
2e260 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2e270 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72  .       * 2nd tr
2e280 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d  y: fail if the m
2e290 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20  od time changed 
2e2a0 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69  or host id is di
2e2b0 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20  fferent, wait . 
2e2c0 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20        *         
2e2d0 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79    10 sec and try
2e2e0 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20   again.       * 
2e2f0 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74  3rd try: break t
2e300 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74  he lock unless t
2e310 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20  he mod time has 
2e320 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20  changed..       
2e330 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
2e340 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20  stat buf;.      
2e350 69 66 28 20 66 73 74 61 74 28 63 6f 6e 63 68 46  if( fstat(conchF
2e360 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
2e370 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
2e380 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2e390 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
2e3a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2e3b0 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
2e3c0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
2e3d0 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ries==1 ){.     
2e3e0 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20     conchModTime 
2e3f0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
2e400 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65  ec;.        usle
2e410 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77  ep(500000); /* w
2e420 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20  ait 0.5 sec and 
2e430 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
2e440 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  in*/.        con
2e450 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d  tinue;  .      }
2e460 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2e470 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20  nTries>1 );.    
2e480 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69    if( conchModTi
2e490 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66  me.tv_sec != buf
2e4a0 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
2e4b0 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20  _sec || .       
2e4c0 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74    conchModTime.t
2e4d0 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74  v_nsec != buf.st
2e4e0 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73  _mtimespec.tv_ns
2e4f0 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ec ){.        re
2e500 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2e510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e520 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65  .      if( nTrie
2e530 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20  s==2 ){  .      
2e540 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58    char tBuf[PROX
2e550 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
2e560 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
2e570 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  = pread(conchFil
2e580 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
2e590 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
2e5a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
2e5b0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
2e5c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
2e5d0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
2e5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e5f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
2e600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e610 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f    if( len>PROXY_
2e620 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75  PATHINDEX && tBu
2e630 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58  f[0]==(char)PROX
2e640 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b  Y_CONCHVERSION){
2e650 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
2e660 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
2e670 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  ck if the host i
2e680 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  d doesn't match 
2e690 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2e6a0 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66   0!=memcmp(&tBuf
2e6b0 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  [PROXY_HEADERLEN
2e6c0 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f  ], myHostID, PRO
2e6d0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b  XY_HOSTIDLEN) ){
2e6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2e6f0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2e700 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e720 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62        /* don't b
2e730 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  reak the lock on
2e740 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61   short read or a
2e750 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63   version mismatc
2e760 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  h */.          r
2e770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2e780 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
2e790 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30       usleep(1000
2e7a0 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31  0000); /* wait 1
2e7b0 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  0 sec and try th
2e7c0 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a  e lock again */.
2e7d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2e7e0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
2e7f0 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
2e800 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20  nTries==3 );.   
2e810 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42     if( 0==proxyB
2e820 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  reakConchLock(pF
2e830 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29  ile, myHostID) )
2e840 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2e850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e860 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
2e870 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
2e880 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e890 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
2e8a0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
2e8b0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
2e8c0 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ile, SHARED_LOCK
2e8d0 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  );          .   
2e8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2e8f0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
2e900 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
2e910 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  le->pMethod->xLo
2e920 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
2e930 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63  *)conchFile, loc
2e940 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  kType);.        
2e950 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2e960 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53    } while( rc==S
2e970 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54  QLITE_BUSY && nT
2e980 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72  ries<3 );.  .  r
2e990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2e9a0 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20  Takes the conch 
2e9b0 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72  by taking a shar
2e9c0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64  ed lock and read
2e9d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f   the contents co
2e9e0 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b  nch, if .** lock
2e9f0 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Path is non-NULL
2ea00 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  , the host ID an
2ea10 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
2ea20 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20   must match.  A 
2ea30 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  NULL .** lockPat
2ea40 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
2ea50 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65   lockPath in the
2ea60 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c   conch file will
2ea70 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
2ea80 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74  .** host IDs mat
2ea90 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63  ch, or a new loc
2eaa0 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67  k path will be g
2eab0 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74  enerated automat
2eac0 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77  ically .** and w
2ead0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f  ritten to the co
2eae0 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nch file..*/.sta
2eaf0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b  tic int proxyTak
2eb00 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
2eb10 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79  *pFile){.  proxy
2eb20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2eb30 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2eb40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
2eb50 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2eb60 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70  ext; .  .  if( p
2eb70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d  Ctx->conchHeld!=
2eb80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2eb90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2eba0 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  se{.    unixFile
2ebb0 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
2ebc0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2ebd0 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74     uuid_t myHost
2ebe0 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72  ID;.    int pErr
2ebf0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  or = 0;.    char
2ec00 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d   readBuf[PROXY_M
2ec10 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
2ec20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d   char lockPath[M
2ec30 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20  AXPATHLEN];.    
2ec40 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61  char *tempLockPa
2ec50 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  th = NULL;.    i
2ec60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ec70 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74  K;.    int creat
2ec80 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20  eConch = 0;.    
2ec90 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20  int hostIdMatch 
2eca0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61  = 0;.    int rea
2ecb0 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dLen = 0;.    in
2ecc0 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68  t tryOldLockPath
2ecd0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f   = 0;.    int fo
2ece0 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
2ecf0 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54   0;.    .    OST
2ed00 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48  RACE(("TAKECONCH
2ed10 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d    %d for %s pid=
2ed20 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %d\n", conchFile
2ed30 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
2ed40 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f    (pCtx->lockPro
2ed50 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c  xyPath ? pCtx->l
2ed60 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22  ockProxyPath : "
2ed70 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
2ed80 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  ()));..    rc = 
2ed90 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d  proxyGetHostID(m
2eda0 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72  yHostID, &pError
2edb0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
2edc0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
2edd0 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  RR ){.      pFil
2ede0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70  e->lastErrno = p
2edf0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74  Error;.      got
2ee00 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
2ee10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2ee20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
2ee30 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
2ee40 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2ee50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2ee70 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
2ee80 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65  .    }.    /* re
2ee90 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ad the existing 
2eea0 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
2eeb0 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b    readLen = seek
2eec0 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c  AndRead((unixFil
2eed0 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c  e*)conchFile, 0,
2eee0 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f   readBuf, PROXY_
2eef0 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20  MAXCONCHLEN);.  
2ef00 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20    if( readLen<0 
2ef10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20  ){.      /* I/O 
2ef20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f  error: lastErrno
2ef30 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
2ef40 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69  ead */.      pFi
2ef50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
2ef60 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45  conchFile->lastE
2ef70 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
2ef80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
2ef90 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
2efa0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
2efb0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
2efc0 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
2efd0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
2efe0 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
2eff0 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
2f000 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
2f010 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
2f020 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
2f030 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
2f040 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
2f050 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
2f060 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
2f070 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
2f080 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
2f090 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
2f0a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2f0b0 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
2f0c0 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
2f0d0 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alre
2f0e0 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
2f0f0 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77  e conch.    ** w
2f100 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  e'll try to use 
2f110 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c 20  the path there, 
2f120 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e  if we can't open
2f130 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c   that path, we'l
2f140 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20  l .    ** retry 
2f150 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d  with a new auto-
2f160 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a  generated path .
2f170 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20      */.    do { 
2f180 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65  /* in case we ne
2f190 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20  ed to try again 
2f1a0 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61  for an :auto: na
2f1b0 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  med lock file */
2f1c0 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72 65  ..      if( !cre
2f1d0 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72  ateConch && !for
2f1e0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b  ceNewLockPath ){
2f1f0 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d  .        hostIdM
2f200 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26  atch = !memcmp(&
2f210 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45  readBuf[PROXY_HE
2f220 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
2f230 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ID, .           
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f250 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53         PROXY_HOS
2f260 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
2f270 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68   /* if the conch
2f280 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72   has data compar
2f290 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a  e the contents *
2f2a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
2f2b0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2f2c0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
2f2d0 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65  /* for auto-name
2f2e0 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  d local lock fil
2f2f0 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68  e, just check th
2f300 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65  e host ID and we
2f310 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a  'll.           *
2f320 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20  * use the local 
2f330 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74  lock file path t
2f340 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e  hat's already in
2f350 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
2f360 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
2f370 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29  f( hostIdMatch )
2f380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
2f390 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28  ze_t pathLen = (
2f3a0 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f  readLen - PROXY_
2f3b0 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20  PATHINDEX);.    
2f3c0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2f3d0 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e       if( pathLen
2f3e0 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a  >=MAXPATHLEN ){.
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
2f400 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e  thLen=MAXPATHLEN
2f410 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2f420 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2f430 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26  mcpy(lockPath, &
2f440 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41  readBuf[PROXY_PA
2f450 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65  THINDEX], pathLe
2f460 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
2f470 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e  lockPath[pathLen
2f480 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
2f490 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
2f4a0 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
2f4b0 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f          tryOldLo
2f4c0 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20  ckPath = 1;.    
2f4d0 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
2f4e0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2f4f0 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68 65  lock path if the
2f500 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
2f510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  */.            g
2f520 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2f530 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2f540 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2f550 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20   hostIdMatch.   
2f560 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 21              && !
2f570 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f  strncmp(pCtx->lo
2f580 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65  ckProxyPath, &re
2f590 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
2f5a0 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20  INDEX],.        
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5c0 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59     readLen-PROXY
2f5d0 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20  _PATHINDEX).    
2f5e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2f5f0 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61   /* conch host a
2f600 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74  nd lock path mat
2f610 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
2f620 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
2f630 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  ch; .        }. 
2f640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2f650 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
2f660 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61 62  nch isn't writab
2f670 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d  le and doesn't m
2f680 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74  atch, we can't t
2f690 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ake it */.      
2f6a0 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  if( (conchFile->
2f6b0 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
2f6c0 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
2f6d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2f6e0 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SY;.        goto
2f6f0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
2f700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
2f710 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74       /* either t
2f720 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20  he conch didn't 
2f730 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64  match or we need
2f740 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
2f750 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66   one */.      if
2f760 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ( !pCtx->lockPro
2f770 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
2f780 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61    proxyGetLockPa
2f790 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c  th(pCtx->dbPath,
2f7a0 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41   lockPath, MAXPA
2f7b0 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
2f7c0 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c  tempLockPath = l
2f7d0 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20  ockPath;.       
2f7e0 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70   /* create a cop
2f7f0 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61  y of the lock pa
2f800 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65  th _only_ if the
2f810 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20   conch is taken 
2f820 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2f830 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74   .      /* updat
2f840 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73  e conch with hos
2f850 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69 73  t and path (this
2f860 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74   will fail if ot
2f870 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
2f880 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65    ** has a share
2f890 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c  d lock already),
2f8a0 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
2f8b0 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68 65  matches, use the
2f8c0 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74   big.      ** st
2f8d0 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ick..      */.  
2f8e0 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63      futimes(conc
2f8f0 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b  hFile->h, NULL);
2f900 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74 49  .      if( hostI
2f910 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61 74  dMatch && !creat
2f920 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20  eConch ){.      
2f930 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d    if( conchFile-
2f940 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68  >pInode && conch
2f950 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
2f960 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20  hared>1 ){.     
2f970 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74       /* We are t
2f980 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
2f990 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
2f9a0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
2f9b0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
2f9c0 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
2f9d0 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
2f9e0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
2f9f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
2fa00 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
2fa10 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
2fa20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  {          .    
2fa30 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
2fa40 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
2fa50 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55   myHostID, EXCLU
2fa60 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2fa70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2fa80 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2fa90 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2faa0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
2fab0 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
2fac0 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  le, EXCLUSIVE_LO
2fad0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
2fae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2faf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fb00 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72  char writeBuffer
2fb10 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
2fb20 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EN];.        int
2fb30 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a   writeSize = 0;.
2fb40 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2fb50 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20   writeBuffer[0] 
2fb60 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  = (char)PROXY_CO
2fb70 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20  NCHVERSION;.    
2fb80 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74      memcpy(&writ
2fb90 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45  eBuffer[PROXY_HE
2fba0 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
2fbb0 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
2fbc0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LEN);.        if
2fbd0 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
2fbe0 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20  yPath!=NULL ){. 
2fbf0 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
2fc00 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
2fc10 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
2fc20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
2fc30 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2fc40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2fc50 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63  .          strlc
2fc60 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
2fc70 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
2fc80 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20  , tempLockPath, 
2fc90 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
2fca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
2fcb0 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59  riteSize = PROXY
2fcc0 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72  _PATHINDEX + str
2fcd0 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72  len(&writeBuffer
2fce0 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
2fcf0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  ]);.        robu
2fd00 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e  st_ftruncate(con
2fd10 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65  chFile->h, write
2fd20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
2fd30 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73  c = unixWrite((s
2fd40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f  qlite3_file *)co
2fd50 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75  nchFile, writeBu
2fd60 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c  ffer, writeSize,
2fd70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79   0);.        fsy
2fd80 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29  nc(conchFile->h)
2fd90 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;.        /* If 
2fda0 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  we created a new
2fdb0 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74   conch file (not
2fdc0 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74 68   just updated th
2fdd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
2fde0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c  .         ** val
2fdf0 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20  id conch file), 
2fe00 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
2fe10 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
2fe20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
2fe30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fe40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fe50 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e  _OK && createCon
2fe60 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ch ){.          
2fe70 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2fe80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
2fe90 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  c;.          int
2fea0 20 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69   err = fstat(pFi
2feb0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
2fec0 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d          if( err=
2fed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2fee0 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d    mode_t cmode =
2fef0 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f   buf.st_mode&(S_
2ff00 49 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20  IRUSR|S_IWUSR | 
2ff10 53 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20  S_IRGRP|S_IWGRP 
2ff20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff40 20 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54            S_IROT
2ff50 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20  H|S_IWOTH);.    
2ff60 20 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74          /* try t
2ff70 6f 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61  o match the data
2ff80 62 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65  base file R/W pe
2ff90 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72  rmissions, ignor
2ffa0 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66  e failure */.#if
2ffb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58  ndef SQLITE_PROX
2ffc0 59 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20  Y_DEBUG.        
2ffd0 20 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68      fchmod(conch
2ffe0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
2fff0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
30000 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
30010 20 20 20 20 20 72 63 20 3d 20 66 63 68 6d 6f 64       rc = fchmod
30020 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
30030 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
30040 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
30050 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
30060 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
30070 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
30090 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
300b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
300c0 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
300d0 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
300e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300f0 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
30100 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
30110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
30120 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
30130 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
30140 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
30150 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
30160 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
30170 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
30180 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30190 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
301a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
301b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
301c0 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
301d0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301f0 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
30200 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
30210 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
30220 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30230 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
30240 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
30250 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
30260 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
30270 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30280 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
30290 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
302a0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
302b0 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
302c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
302d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
302e0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
302f0 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
30300 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
30310 68 3e 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  h>=0 ){.#ifdef S
30320 54 52 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f  TRICT_CLOSE_ERRO
30330 52 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  R.          if( 
30340 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 20  close(pFile->h) 
30350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
30360 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
30370 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
30380 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30390 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
303a0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73            }.#els
303b0 65 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  e.          clos
303c0 65 28 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20  e(pFile->h); /* 
303d0 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64  silently leak fd
303e0 20 69 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64   if fail */.#end
303f0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
30400 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20       pFile->h = 
30410 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  -1;.        int 
30420 66 64 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e  fd = open(pCtx->
30430 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f  dbPath, pFile->o
30440 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  penFlags,.      
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30460 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
30470 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
30480 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
30490 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
304a0 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
304b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
304c0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d>=0 ){.        
304d0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b    pFile->h = fd;
304e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
304f0 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c            rc=SQL
30500 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
30510 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53  T; /* SQLITE_BUS
30520 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  Y? proxyTakeConc
30530 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20  h called.       
30540 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69      during locki
30550 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ng */.        }.
30560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30580 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  && !pCtx->lockPr
30590 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63  oxy ){.        c
305a0 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70  har *path = temp
305b0 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c  LockPath ? tempL
305c0 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e  ockPath : pCtx->
305d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
305e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
305f0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
30600 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63  path, &pCtx->loc
30610 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20  kProxy, 1);.    
30620 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30630 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
30640 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79  ITE_NOMEM && try
30650 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  OldLockPath ){. 
30660 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63           /* we c
30670 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74  ouldn't create t
30680 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
30690 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20  le with the old 
306a0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
306b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
306c0 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75  try again via au
306d0 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20  to-naming .     
306e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
306f0 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50     forceNewLockP
30700 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ath = 1;.       
30710 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
30720 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
30730 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f   continue; /* go
30740 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20   back to the do 
30750 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70  {} while start p
30760 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20  oint, try again 
30770 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
30780 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
307a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
307b0 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  to make a copy o
307c0 66 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74  f path if we ext
307d0 72 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65  racted the value
307e0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f  .         ** fro
307f0 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  m the conch file
30800 20 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73   or the path was
30810 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
30820 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20  e stack.        
30830 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
30840 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  tempLockPath ){.
30850 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
30860 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
30870 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
30880 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29  0, tempLockPath)
30890 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
308a0 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
308b0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
308c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
308d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
308e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
308f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30910 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f          pCtx->co
30920 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20  nchHeld = 1;.   
30930 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
30940 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
30950 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  y->pMethod == &a
30960 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
30970 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b           afpLock
30980 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43  ingContext *afpC
30990 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  tx;.          af
309a0 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69  pCtx = (afpLocki
309b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78  ngContext *)pCtx
309c0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63  ->lockProxy->loc
309d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
309e0 20 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64         afpCtx->d
309f0 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  bPath = pCtx->lo
30a00 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
30a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
30a20 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f  lse {.        co
30a30 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
30a40 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
30a50 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
30a60 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
30a70 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
30a80 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20  ACE(("TAKECONCH 
30a90 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
30aa0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
30ab0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
30ac0 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c  TE_OK?"ok":"fail
30ad0 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ed"));.      ret
30ae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68  urn rc;.    } wh
30af0 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63  ile (1); /* in c
30b00 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ase we need to r
30b10 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20  etry the :auto: 
30b20 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20  lock file - .   
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
30b40 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   we should never
30b50 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74   get here except
30b60 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e   via the 'contin
30b70 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d  ue' call. */.  }
30b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69  .}../*.** If pFi
30b90 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  le holds a lock 
30ba0 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c  on a conch file,
30bb0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68   then release th
30bc0 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  at lock..*/.stat
30bd0 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65  ic int proxyRele
30be0 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  aseConch(unixFil
30bf0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
30c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30c10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
30c20 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f  outine return co
30c30 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  de */.  proxyLoc
30c40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
30c50 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69  x;  /* The locki
30c60 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74  ng context for t
30c70 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f  he proxy lock */
30c80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
30c90 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  chFile;        /
30ca0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
30cb0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  nch file */..  p
30cc0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
30cd0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
30ce0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
30cf0 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20  xt;.  conchFile 
30d00 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
30d10 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  e;.  OSTRACE(("R
30d20 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
30d30 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
30d40 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
30d50 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
30d60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
30d70 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
30d80 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
30d90 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67  ), .           g
30da0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28  etpid()));.  if(
30db0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
30dc0 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  >0 ){.    rc = c
30dd0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
30de0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
30df0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
30e00 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
30e10 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68   }.  pCtx->conch
30e20 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52  Held = 0;.  OSTR
30e30 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE(("RELEASECON
30e40 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
30e50 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
30e60 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
30e70 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
30e80 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65  failed")));.  re
30e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30ea0 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  * Given the name
30eb0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66   of a database f
30ec0 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ile, compute the
30ed0 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e   name of its con
30ee0 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72  ch file..** Stor
30ef0 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  e the conch file
30f00 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  name in memory o
30f10 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
30f20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
30f30 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61  * Make *pConchPa
30f40 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  th point to the 
30f50 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72  new name.  Retur
30f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
30f70 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c  uccess.** or SQL
30f80 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61  ITE_NOMEM if una
30f90 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65  ble to obtain me
30fa0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
30fb0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
30fc0 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
30fd0 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ng that the allo
30fe0 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  cated memory.** 
30ff0 73 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61  space is eventua
31000 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
31010 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20   *pConchPath is 
31020 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61  set to NULL if a
31030 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
31040 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  on error occurs.
31050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31060 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
31070 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62  athname(char *db
31080 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f  Path, char **pCo
31090 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  nchPath){.  int 
310a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
310b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
310c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
310d0 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  nt len = (int)st
310e0 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a  rlen(dbPath); /*
310f0 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62   Length of datab
31100 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64  ase filename - d
31110 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20  bPath */.  char 
31120 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20  *conchPath;     
31130 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66           /* buff
31140 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63  er in which to c
31150 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e  onstruct conch n
31160 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ame */..  /* All
31170 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
31180 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61  the conch filena
31190 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  me and initializ
311a0 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20  e the name to.  
311b0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** the name of t
311c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
311d0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a  base file. */  .
311e0 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20    *pConchPath = 
311f0 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61  conchPath = (cha
31200 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
31210 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69  oc(len + 8);.  i
31220 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20  f( conchPath==0 
31230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
31240 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
31250 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61    memcpy(conchPa
31260 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b  th, dbPath, len+
31270 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20  1);.  .  /* now 
31280 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66  insert a "." bef
31290 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63  ore the last / c
312a0 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f  haracter */.  fo
312b0 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e  r( i=(len-1); i>
312c0 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69  =0; i-- ){.    i
312d0 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d  f( conchPath[i]=
312e0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b  ='/' ){.      i+
312f0 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
31300 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63      }.  }.  conc
31310 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20  hPath[i]='.';.  
31320 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b  while ( i<len ){
31330 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69  .    conchPath[i
31340 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20  +1]=dbPath[i];. 
31350 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
31360 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63  * append the "-c
31370 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20  onch" suffix to 
31380 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65  the file */.  me
31390 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b  mcpy(&conchPath[
313a0 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20  i+1], "-conch", 
313b0 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  7);.  assert( (i
313c0 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50  nt)strlen(conchP
313d0 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b  ath) == len+7 );
313e0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
313f0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b  E_OK;.}.../* Tak
31400 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69  es a fully confi
31410 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b  gured proxy lock
31420 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66  ing-style unix f
31430 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73  ile and switches
31440 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  .** the local lo
31450 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f  ck file path .*/
31460 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74  .static int swit
31470 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28  chLockProxyPath(
31480 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
31490 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
314a0 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  h) {.  proxyLock
314b0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
314c0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
314d0 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
314e0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
314f0 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20    char *oldPath 
31500 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
31510 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20  yPath;.  int rc 
31520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
31530 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
31540 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock!=NO_LOCK ){
31550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31560 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a  TE_BUSY;.  }  ..
31570 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
31580 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69  do if the path i
31590 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f  s NULL, :auto: o
315a0 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  r matches the ex
315b0 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20  isting path */. 
315c0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
315d0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
315e0 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
315f0 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f  uto:") ||.    (o
31600 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63  ldPath && !strnc
31610 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68  mp(oldPath, path
31620 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29  , MAXPATHLEN)) )
31630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31640 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
31650 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
31660 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
31670 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
31680 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d  pCtx->lockProxy=
31690 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e  NULL;.    pCtx->
316a0 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
316b0 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79     if( lockProxy
316c0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
316d0 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d  rc=lockProxy->pM
316e0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
316f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f  qlite3_file *)lo
31700 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
31710 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31720 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
31730 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79  3_free(lockProxy
31740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
31750 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74  ite3_free(oldPat
31760 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  h);.    pCtx->lo
31770 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
31780 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
31790 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20   path);.  }.  . 
317a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
317b0 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20  *.** pFile is a 
317c0 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65  file that has be
317d0 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70  en opened by a p
317e0 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e  rior xOpen call.
317f0 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61    dbPath.** is a
31800 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61   string buffer a
31810 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c  t least MAXPATHL
31820 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20  EN+1 characters 
31830 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  in size..**.** T
31840 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64  his routine find
31850 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73   the filename as
31860 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46  sociated with pF
31870 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69  ile and writes i
31880 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e  t.** int dbPath.
31890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
318a0 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
318b0 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
318c0 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a  e *pFile, char *
318d0 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66  dbPath){.#if def
318e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
318f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
31900 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
31910 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
31920 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20  afp style keeps 
31930 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
31940 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68  he db path in th
31950 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64  e filePath field
31960 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
31970 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73  struct */.    as
31980 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
31990 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
319a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
319b0 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
319c0 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74     strlcpy(dbPat
319d0 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  h, ((afpLockingC
319e0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
319f0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
31a00 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48  >dbPath, MAXPATH
31a10 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23  LEN);.  } else.#
31a20 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
31a30 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64  e->pMethod == &d
31a40 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
31a50 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f  ){.    /* dot lo
31a60 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68  ck style uses th
31a70 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
31a80 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64  t to store the d
31a90 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66  ot lock.    ** f
31aa0 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
31ab0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
31ac0 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e  ((char *)pFile->
31ad0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20  lockingContext) 
31ae0 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b  - strlen(DOTLOCK
31af0 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65  _SUFFIX);.    me
31b00 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  mcpy(dbPath, (ch
31b10 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
31b20 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20  ingContext, len 
31b30 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 1);.  }else{. 
31b40 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20     /* all other 
31b50 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c  styles use the l
31b60 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
31b70 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66  o store the db f
31b80 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
31b90 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28  assert( strlen((
31ba0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
31bb0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
31bc0 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
31bd0 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
31be0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
31bf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d  ockingContext, M
31c00 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a  AXPATHLEN);.  }.
31c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31c20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  OK;.}../*.** Tak
31c30 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69  es an already fi
31c40 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c  lled in unix fil
31c50 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20  e and alters it 
31c60 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b  so all file lock
31c70 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ing .** will be 
31c80 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
31c90 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63   local proxy loc
31ca0 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c  k file.  The fol
31cb0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a  lowing fields.**
31cc0 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69   are preserved i
31cd0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
31ce0 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68  ntext so that th
31cf0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
31d00 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75  ed and .** the u
31d10 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72  nix structure pr
31d20 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75  operly cleaned u
31d30 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a  p at close time:
31d40 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  .**  ->lockingCo
31d50 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74  ntext.**  ->pMet
31d60 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hod.*/.static in
31d70 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
31d80 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
31d90 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
31da0 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
31db0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31dc0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61  ext *pCtx;.  cha
31dd0 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48  r dbPath[MAXPATH
31de0 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a  LEN+1];       /*
31df0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
31e00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
31e10 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e  char *lockPath=N
31e20 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ULL;.  int rc = 
31e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
31e40 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
31e50 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock!=NO_LOCK ){
31e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31e70 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
31e80 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
31e90 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
31ea0 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
31eb0 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
31ec0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
31ed0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
31ee0 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
31ef0 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
31f00 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
31f10 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
31f20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52   .  OSTRACE(("TR
31f30 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
31f40 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
31f50 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
31f60 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
31f70 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
31f80 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
31f90 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  ;..  pCtx = sqli
31fa0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
31fb0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69  of(*pCtx) );.  i
31fc0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
31fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31fe0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
31ff0 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a  set(pCtx, 0, siz
32000 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20  eof(*pCtx));..  
32010 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
32020 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62  ConchPathname(db
32030 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
32040 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69  chFilePath);.  i
32050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32060 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f   ){.    rc = pro
32070 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
32080 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
32090 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
320a0 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  chFile, 0);.    
320b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
320c0 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69  ANTOPEN && ((pFi
320d0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
320e0 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20  RDWR) == 0) ){. 
320f0 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74       /* if (a) t
32100 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72  he open flags ar
32110 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62  e not O_RDWR, (b
32120 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  ) the conch isn'
32130 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20  t there, and.   
32140 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69     ** (c) the fi
32150 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61  le system is rea
32160 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61  d-only, then ena
32170 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61  ble no-locking a
32180 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  ccess..      ** 
32190 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f  Ugh, since O_RDO
321a0 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74  NLY==0x0000 we t
321b0 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20  est for !O_RDWR 
321c0 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61  since unixOpen a
321d0 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20  sserts.      ** 
321e0 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77  that openFlags w
321f0 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e  ill have only on
32200 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72  e of O_RDONLY or
32210 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a   O_RDWR..      *
32220 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
32230 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
32240 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
32250 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20  conchInfo;.     
32260 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20   int goLockless 
32270 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
32280 73 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68  stat(pCtx->conch
32290 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63 68  FilePath, &conch
322a0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
322b0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20          int err 
322c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
322d0 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e   if( (err==ENOEN
322e0 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64 62  T) && (statfs(db
322f0 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21  Path, &fsInfo) !
32300 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  = -1) ){.       
32310 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20     goLockless = 
32320 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
32330 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d  MNT_RDONLY) == M
32340 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  NT_RDONLY;.     
32350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32360 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73     if( goLockles
32370 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  s ){.        pCt
32380 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d  x->conchHeld = -
32390 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20  1; /* read only 
323a0 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a  FS/ lockless */.
323b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
323c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
323d0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66      }.  }  .  if
323e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
323f0 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  && lockPath ){. 
32400 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
32410 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
32420 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b  DbStrDup(0, lock
32430 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Path);.  }..  if
32440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32450 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62 50  ){.    pCtx->dbP
32460 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
32470 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68 29  trDup(0, dbPath)
32480 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
32490 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a  dbPath==NULL ){.
324a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
324b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
324c0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
324d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
324e0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61   all memory is a
324f0 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79 73  llocated, proxys
32500 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e 64   are created and
32510 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20 20   assigned, .    
32520 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c 6f  ** switch the lo
32530 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e  cking context an
32540 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 72  d pMethod then r
32550 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  eturn..    */.  
32560 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69    pCtx->oldLocki
32570 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c  ngContext = pFil
32580 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
32590 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  t;.    pFile->lo
325a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
325b0 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70  Ctx;.    pCtx->p
325c0 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c  OldMethod = pFil
325d0 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20  e->pMethod;.    
325e0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
325f0 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
32600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
32610 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  f( pCtx->conchFi
32620 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43 74  le ){ .      pCt
32630 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d  x->conchFile->pM
32640 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
32650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 43  qlite3_file *)pC
32660 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  tx->conchFile);.
32670 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
32680 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
32690 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  le);.    }.    s
326a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
326b0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
326c0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
326d0 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e  3_free(pCtx->con
326e0 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20  chFilePath); .  
326f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32700 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Ctx);.  }.  OSTR
32710 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59  ACE(("TRANSPROXY
32720 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c    %d %s\n", pFil
32730 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
32740 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
32750 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
32760 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ")));.  return r
32770 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
32780 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65  s routine handle
32790 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s sqlite3_file_c
327a0 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74  ontrol() calls t
327b0 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69 63  hat are specific
327c0 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63  .** to proxy loc
327d0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
327e0 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
327f0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
32800 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
32810 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77  oid *pArg){.  sw
32820 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
32830 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f  case SQLITE_GET_
32840 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
32850 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
32860 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
32870 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66  le*)id;.      if
32880 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
32890 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68   == &proxyIoMeth
328a0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ods ){.        p
328b0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
328c0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
328d0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  yLockingContext*
328e0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
328f0 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
32900 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
32910 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69  File);.        i
32920 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
32930 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  xyPath ){.      
32940 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
32950 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d   **)pArg = pCtx-
32960 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a  >lockProxyPath;.
32970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32980 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74           *(const
32990 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20   char **)pArg = 
329a0 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c  ":auto: (not hel
329b0 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d)";.        }. 
329c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
329d0 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
329e0 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c  ar **)pArg = NUL
329f0 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
32a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32a10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
32a20 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
32a30 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
32a40 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
32a50 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
32a60 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  )id;.      int r
32a70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32a80 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79       int isProxy
32a90 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e  Style = (pFile->
32aa0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
32ab0 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  yIoMethods);.   
32ac0 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
32ad0 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72  L || (const char
32ae0 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20   *)pArg==0 ){.  
32af0 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f 78        if( isProx
32b00 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20  yStyle ){.      
32b10 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20      /* turn off 
32b20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20  proxy locking - 
32b30 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  not supported */
32b40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32b50 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53  SQLITE_ERROR /*S
32b60 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20  QLITE_PROTOCOL? 
32b70 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f  SQLITE_MISUSE?*/
32b80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32b90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
32ba0 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
32bb0 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f  king - already o
32bc0 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20  ff - NOOP */.   
32bd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32be0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
32bf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32c00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
32c10 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63   *proxyPath = (c
32c20 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67  onst char *)pArg
32c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
32c40 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20  ProxyStyle ){.  
32c50 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63          proxyLoc
32c60 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
32c70 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  x = .           
32c80 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32c90 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
32ca0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
32cb0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74 72          if( !str
32cc0 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f  cmp(pArg, ":auto
32cd0 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  :") .           
32ce0 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  || (pCtx->lockPr
32cf0 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20 20  oxyPath &&.     
32d00 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e 63            !strnc
32d10 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  mp(pCtx->lockPro
32d20 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74  xyPath, proxyPat
32d30 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a  h, MAXPATHLEN)).
32d40 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
32d50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
32d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32d80 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74 63        rc = switc
32d90 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70  hLockProxyPath(p
32da0 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
32db0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32dc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32dd0 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f         /* turn o
32de0 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  n proxy file loc
32df0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  king */.        
32e00 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
32e10 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46  sformUnixFile(pF
32e20 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ile, proxyPath);
32e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32e40 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
32e50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  rc;.    }.    de
32e60 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
32e70 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
32e80 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73  The call assures
32e90 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64   that only valid
32ea0 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e   opcodes are sen
32eb0 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t */.    }.  }. 
32ec0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
32ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32ee0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
32ef0 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76 69  Within this divi
32f00 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69  sion (the proxyi
32f10 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ng locking imple
32f20 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70  mentation) the p
32f30 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f  rocedures.** abo
32f40 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72  ve this point ar
32f50 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e  e all utilities.
32f60 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74    The lock-relat
32f70 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  ed methods of th
32f80 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  e.** proxy-locki
32f90 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ng sqlite3_io_me
32fa0 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c  thod object foll
32fb0 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ow..*/.../*.** T
32fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
32fd0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
32fe0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
32ff0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
33000 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
33010 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
33020 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
33030 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
33040 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
33050 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
33060 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
33070 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
33080 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
33090 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
330a0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
330b0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
330c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
330d0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
330e0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
330f0 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
33100 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
33110 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
33120 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69  pResOut) {.  uni
33130 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
33140 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
33150 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61  int rc = proxyTa
33160 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a  keConch(pFile);.
33170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33180 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79  _OK ){.    proxy
33190 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
331a0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
331b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
331c0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
331d0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ext;.    if( pCt
331e0 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
331f0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
33200 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e   *proxy = pCtx->
33210 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20  lockProxy;.     
33220 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70   return proxy->p
33230 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
33240 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69  servedLock((sqli
33250 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
33260 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d   pResOut);.    }
33270 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65  else{ /* conchHe
33280 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65  ld < 0 is lockle
33290 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ss */.      pRes
332a0 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out=0;.    }.  }
332b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
332c0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
332d0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
332e0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
332f0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
33300 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
33310 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
33320 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
33330 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
33340 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
33350 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
33360 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
33370 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
33380 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
33390 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
333a0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
333b0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
333c0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
333d0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
333e0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
333f0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
33400 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
33410 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
33420 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
33430 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
33440 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
33450 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
33460 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
33470 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
33480 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
33490 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
334a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
334b0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
334c0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
334d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
334e0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
334f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
33500 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
33510 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
33520 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
33530 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
33540 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
33550 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
33560 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
33570 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
33580 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
33590 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
335a0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
335b0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
335c0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
335d0 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
335e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
335f0 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
33600 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
33610 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
33620 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
33630 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
33640 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
33650 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
33660 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
33670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
33680 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33690 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
336a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
336b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
336c0 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
336d0 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
336e0 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
336f0 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
33700 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
33710 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
33720 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
33730 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f  qlite3_file*)pro
33740 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a  xy, eFileLock);.
33750 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
33760 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e  leLock = proxy->
33770 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  eFileLock;.    }
33780 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63  else{.      /* c
33790 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73 20  onchHeld < 0 is 
337a0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
337b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
337c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
337d0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
337e0 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
337f0 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
33800 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
33810 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
33820 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
33830 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
33840 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
33850 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
33860 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
33870 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
33880 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
33890 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
338a0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
338b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
338c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
338d0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
338e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
338f0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
33900 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
33910 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
33920 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72  d;.  int rc = pr
33930 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
33940 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  le);.  if( rc==S
33950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33960 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33970 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
33980 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33990 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
339a0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66  gContext;.    if
339b0 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
339c0 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  d>0 ){.      uni
339d0 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70  xFile *proxy = p
339e0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a  Ctx->lockProxy;.
339f0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
33a00 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
33a10 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33a20 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f  *)proxy, eFileLo
33a30 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ck);.      pFile
33a40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72  ->eFileLock = pr
33a50 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  oxy->eFileLock;.
33a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33a70 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20   /* conchHeld < 
33a80 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  0 is lockless */
33a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
33aa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33ab0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74 68   Close a file th
33ac0 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c 6f  at uses proxy lo
33ad0 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cks..*/.static i
33ae0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
33af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
33b00 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
33b10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
33b20 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
33b30 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b  d;.    proxyLock
33b40 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
33b50 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
33b60 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
33b70 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
33b80 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
33b90 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
33ba0 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
33bb0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
33bc0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
33bd0 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72  hFile;.    int r
33be0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33bf0 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b     .    if( lock
33c00 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
33c10 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  c = lockProxy->p
33c20 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
33c30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
33c40 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43  ockProxy, NO_LOC
33c50 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
33c60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33c70 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f      rc = lockPro
33c80 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  xy->pMethod->xCl
33c90 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
33ca0 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  e*)lockProxy);. 
33cb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
33cc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
33cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
33ce0 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70 43  Proxy);.      pC
33cf0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  tx->lockProxy = 
33d00 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
33d10 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20   conchFile ){.  
33d20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
33d30 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20 20  nchHeld ){.     
33d40 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65 6c     rc = proxyRel
33d50 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  easeConch(pFile)
33d60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
33d70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33d80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
33d90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
33da0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
33db0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
33dc0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
33dd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
33df0 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a  ree(conchFile);.
33e00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
33e10 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d  3DbFree(0, pCtx-
33e20 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b  >lockProxyPath);
33e30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33e40 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  e(pCtx->conchFil
33e50 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
33e60 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74  te3DbFree(0, pCt
33e70 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
33e80 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
33e90 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
33ea0 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
33eb0 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
33ec0 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
33ed0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
33ee0 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
33ef0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
33f00 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
33f10 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
33f20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33f30 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
33f40 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
33f50 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
33f60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
33f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
33f80 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
33f90 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33fa0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33fb0 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
33fc0 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
33fd0 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
33fe0 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
33ff0 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
34000 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
34010 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
34020 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
34030 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
34040 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
34050 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
34060 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
34070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
34080 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
34090 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
340a0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
34110 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
34120 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
34130 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
34140 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
34150 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
34160 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
34170 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
34180 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
34190 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
341a0 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
341b0 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
341c0 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
341d0 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
341e0 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
341f0 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
34200 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
34210 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
34220 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
34230 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
34240 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
34250 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
34260 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
34270 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
34280 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
34290 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
342a0 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
342b0 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
342c0 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
342d0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
342e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
342f0 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
34300 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
34310 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
34320 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
34330 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
34340 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
34350 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
34360 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
34370 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
34380 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
34390 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
343a0 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
343b0 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
343c0 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
343d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
343e0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
343f0 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
34400 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
34410 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
34420 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
34430 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
34440 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
34450 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
34460 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
34470 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
34480 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
34490 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
344a0 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
344b0 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
344c0 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
344d0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
344e0 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
344f0 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
34500 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
34510 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
34520 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
34530 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
34540 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
34550 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
34560 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
34570 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
34580 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
34590 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
345a0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
345b0 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
345c0 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
345d0 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
345e0 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
345f0 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
34600 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
34610 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
34620 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
34630 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
34640 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
34650 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
34660 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
34670 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
34680 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
34690 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
346a0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
346b0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
346c0 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
346d0 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
346e0 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
346f0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
34700 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
34710 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
34720 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
34730 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
34740 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
34750 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
34760 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
34770 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
34780 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
34790 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
347a0 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
347b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
347c0 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
347d0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
347e0 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
347f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
34800 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
34810 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
34820 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
34830 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
34840 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
34850 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
34860 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
34870 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
34880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34890 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
348a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348b0 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
348c0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
348d0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
348e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348f0 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
34900 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
34910 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
34920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34930 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
34940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
34950 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34970 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
34980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
34990 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
349a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
349b0 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
349c0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
349d0 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
349e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
349f0 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
34a00 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
34a10 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
34a20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
34a30 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
34a40 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
34a50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34a60 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
34a70 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
34a80 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
34a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34aa0 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
34ab0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
34ac0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ae0 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
34af0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
34b00 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
34b30 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
34b40 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
34b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34b60 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
34b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
34b80 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
34b90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34ba0 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
34bb0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
34bc0 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
34bd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
34be0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
34bf0 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
34c00 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
34c10 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
34c20 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
34c30 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
34c40 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20  imeInt64 */     
34c50 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f        \.  }..  /
34c60 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75  *.  ** All defau
34c70 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69  lt VFSes for uni
34c80 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  x are contained 
34c90 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
34ca0 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a   array..  **.  *
34cb0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
34cc0 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78  sqlite3_vfs.pNex
34cd0 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56  t field of the V
34ce0 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64  FS object is mod
34cf0 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ified.  ** by th
34d00 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68  e SQLite core wh
34d10 65 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65  en the VFS is re
34d20 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68  gistered.  So th
34d30 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
34d40 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65   array cannot be
34d50 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73   const..  */.  s
34d60 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
34d70 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66  s aVfs[] = {.#if
34d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
34d90 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
34da0 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64  (OS_VXWORKS || d
34db0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
34dc0 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  )).    UNIXVFS("
34dd0 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
34de0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
34df0 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e   ),.#else.    UN
34e00 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
34e10 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69         posixIoFi
34e20 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
34e30 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
34e40 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f  -none",     nolo
34e50 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ckIoFinder ),.  
34e60 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
34e70 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f  dotfile",  dotlo
34e80 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ckIoFinder ),.#i
34e90 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
34ea0 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
34eb0 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46  amedsem", semIoF
34ec0 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
34ed0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
34ee0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
34ef0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
34f00 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73  x-posix",    pos
34f10 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ixIoFinder ),.#i
34f20 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
34f30 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
34f40 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b  flock",    flock
34f50 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
34f60 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
34f70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34f80 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
34f90 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
34fa0 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
34fb0 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70  x-afp",      afp
34fc0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
34fd0 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66  UNIXVFS("unix-nf
34fe0 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69  s",      nfsIoFi
34ff0 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
35000 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22  VFS("unix-proxy"
35010 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  ,    proxyIoFind
35020 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  er ),.#endif.  }
35030 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
35040 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
35050 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
35060 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
35070 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64  ll VFSes defined
35080 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61   in the aVfs[] a
35090 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  rray */.  for(i=
350a0 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66  0; i<(sizeof(aVf
350b0 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  s)/sizeof(sqlite
350c0 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20  3_vfs)); i++){. 
350d0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
350e0 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d  egister(&aVfs[i]
350f0 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
35100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35110 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64   .}../*.** Shutd
35120 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e  own the operatin
35130 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
35140 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f  ce..**.** Some o
35150 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
35160 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
35170 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69  o some cleanup i
35180 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a  n this routine,.
35190 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79  ** to release dy
351a0 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
351b0 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75  ted objects.  Bu
351c0 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a  t not on unix..*
351d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
351e0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e  s a no-op for un
351f0 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
35200 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
35210 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
35220 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69  E_OK; .}. .#endi
35230 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55  f /* SQLITE_OS_U
35240 4e 49 58 20 2a 2f 0a                             NIX */.