/ Hex Artifact Content
Login

Artifact 9a129123a054572d4d8cf1766fb093b0e45ab57c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 66 6e 64 65 66 20 53 51  no.h>.#ifndef SQ
1140: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 69  LITE_OMIT_WAL.#i
1150: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
1160: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  .h>.#endif..#if 
1170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1180: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e  CKING_STYLE.# in
1190: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
11a0: 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  .h>.# if OS_VXWO
11b0: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
11c0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
11d0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
11e0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
11f0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
1200: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
1210: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
1220: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
1230: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1240: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1260: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
1270: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1280: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
1290: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
12a0: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
12b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  if../*.** Allowe
12c0: 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78  d values of unix
12d0: 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a  File.fsFlags.*/.
12e0: 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46  #define SQLITE_F
12f0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20  SFLAGS_IS_MSDOS 
1300: 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49      0x1../*.** I
1310: 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20 74  f we are to be t
1320: 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c  hread-safe, incl
1330: 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64 73  ude the pthreads
1340: 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66 69   header and defi
1350: 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ne.** the SQLITE
1360: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61  _UNIX_THREADS ma
1370: 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  cro..*/.#if SQLI
1380: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20  TE_THREADSAFE.# 
1390: 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64  include <pthread
13a0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
13b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
13c0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
13d0: 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   Default permiss
13e0: 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69  ions when creati
13f0: 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f  ng a new file.*/
1400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1410: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
1420: 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e  MISSIONS.# defin
1430: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
1440: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1450: 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f  S 0644.#endif../
1460: 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  *. ** Default pe
1470: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1480: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1490: 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64  xy dir. */.#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
14c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
14d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
14e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
14f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1500: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1510: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1520: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1530: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1540: 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  2../*.** Only se
1550: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1560: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1570: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1580: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1590: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
15a0: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
15b0: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
15c0: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
15d0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
15e0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
15f0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
1600: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
1610: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1620: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1640: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1650: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1660: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1670: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1680: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1690: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
16a0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
16b0: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
16e0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
16f0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
1700: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
1710: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
1720: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1730: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1740: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1750: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1760: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1770: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1780: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1790: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
17a0: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
17b0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
17c0: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
17d0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
17e0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
17f0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
1800: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
1810: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
1820: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1830: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1840: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1850: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1860: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1870: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
18a0: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
18b0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
18c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18d0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
18e0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
18f0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
1900: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
1910: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
1920: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1930: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1940: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1950: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1960: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1970: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1980: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1990: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
19a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
19b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
19c0: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
19d0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
19e0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
19f0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
1a00: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
1a10: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
1a20: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69  t entry */.  uni
1a30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1a40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1a50: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
1a60: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
1a70: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1ab0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  or */.  int dirf
1ac0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1af0: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
1b00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1b10: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b30: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b40: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b60: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b70: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b80: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b90: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1ba0: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bd0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1be0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bf0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1c00: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1c10: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c20: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c30: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c40: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c70: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c90: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1ca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1cb0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1cc0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cf0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1d00: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1d10: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d40: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d50: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d70: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1da0: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1db0: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1dc0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1dd0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1de0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1df0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1e00: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e30: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e40: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e60: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e90: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1ea0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1eb0: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ec0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1ed0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ef0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1f00: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1f10: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f20: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f30: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f50: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f70: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f80: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f90: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1fa0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1fb0: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fc0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fd0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fe0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1ff0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2000: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2010: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2020: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2030: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2040: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2050: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2060: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2070: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2080: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2090: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
20a0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
20b0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20c0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20d0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20e0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20f0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2100: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2110: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2120: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2130: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2140: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2150: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2160: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2170: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2180: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2190: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
21a0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
21b0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21c0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21e0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21f0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2200: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2210: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2220: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2230: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2240: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2250: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2260: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2270: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 30  NIXFILE_EXCL   0
2280: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2290: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
22a0: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
22b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
22c0: 5f 52 44 4f 4e 4c 59 20 30 78 30 32 20 20 20 20  _RDONLY 0x02    
22d0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
22e0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 0a  s read only */..
22f0: 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f  /*.** Include co
2300: 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f  de that is commo
2310: 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20  n to all os_*.c 
2320: 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64  files.*/.#includ
2330: 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a  e "os_common.h".
2340: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
2350: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
2360: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
2370: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
2380: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
2390: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
23a0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
23b0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
23c0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
23d0: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
23e0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
23f0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2400: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
2410: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
2420: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
2430: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
2440: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
2450: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
2460: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69  *.** The threadi
2470: 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73  d macro resolves
2480: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69   to the thread-i
2490: 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64  d or to 0.  Used
24a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
24b0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
24c0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ly..*/.#if SQLIT
24d0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65  E_THREADSAFE.#de
24e0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
24f0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
2500: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
2510: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
2520: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
2530: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
2540: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
2550: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
2560: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
2570: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
2580: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
2590: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
25a0: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
25b0: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
25c0: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
25d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
25e0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
25f0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
2600: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
2610: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
2620: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
2630: 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c  ruct unix_syscal
2640: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
2650: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
2660: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2670: 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f  he sytem call */
2680: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2690: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
26a0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
26b0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
26c0: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
26d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
26e0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
26f0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
2700: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b  yscall[] = {.  {
2710: 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20   "open",        
2720: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2730: 6c 5f 70 74 72 29 6f 70 65 6e 2c 20 20 20 20 20  l_ptr)open,     
2740: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2750: 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e  osOpen      ((in
2760: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
2770: 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61  ,int,int))aSysca
2780: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
2790: 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20  .  { "close",   
27a0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
27b0: 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c  scall_ptr)close,
27c0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
27d0: 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20  ine osClose     
27e0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53  ((int(*)(int))aS
27f0: 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65  yscall[1].pCurre
2800: 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73  nt)..  { "access
2810: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
2820: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63  3_syscall_ptr)ac
2830: 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a  cess,     0  },.
2840: 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73  #define osAccess
2850: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2860: 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53  st char*,int))aS
2870: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
2880: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64  nt)..  { "getcwd
2890: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
28a0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
28b0: 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a  tcwd,     0  },.
28c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64  #define osGetcwd
28d0: 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63      ((char*(*)(c
28e0: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
28f0: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2900: 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20  t)..  { "stat", 
2910: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2920: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61  _syscall_ptr)sta
2930: 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  t,       0  },.#
2940: 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20  define osStat   
2950: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2960: 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73  t char*,struct s
2970: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34  tat*))aSyscall[4
2980: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a  ].pCurrent)../*.
2990: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
29a0: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
29b0: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
29c0: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
29d0: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
29e0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
29f0: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
2a00: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
2a10: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
2a20: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
2a30: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2a40: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
2a50: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
2a60: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
2a70: 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64   is DOS - what d
2a80: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
2a90: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
2aa0: 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20  __.  { "fstat", 
2ab0: 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
2ac0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
2ad0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28  #define osFstat(
2ae0: 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73  a,b,c)    0.#els
2af0: 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61  e     .  { "fsta
2b00: 74 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  t",        (sqli
2b10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2b20: 66 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d  fstat,      0  }
2b30: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
2b40: 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  t     ((int(*)(i
2b50: 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  nt,struct stat*)
2b60: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2b70: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20  rrent).#endif.. 
2b80: 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20   { "ftruncate", 
2b90: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2ba0: 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74  all_ptr)ftruncat
2bb0: 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  e,  0  },.#defin
2bc0: 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28  e osFtruncate ((
2bd0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74  int(*)(int,off_t
2be0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43  ))aSyscall[6].pC
2bf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
2c00: 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71  ntl",        (sq
2c10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2c20: 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20  r)fcntl,      0 
2c30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63   },.#define osFc
2c40: 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ntl     ((int(*)
2c50: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
2c60: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
2c70: 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c  nt)..  { "read",
2c80: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2c90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65  3_syscall_ptr)re
2ca0: 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a  ad,       0  },.
2cb0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20  #define osRead  
2cc0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
2cd0: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
2ce0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  t))aSyscall[8].p
2cf0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
2d00: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
2d10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
2d20: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d30: 47 5f 53 54 59 4c 45 29 0a 20 20 7b 20 22 70 72  G_STYLE).  { "pr
2d40: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
2d50: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2d60: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
2d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
2d80: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
2d90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2da0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
2db0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
2dc0: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
2dd0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
2de0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
2df0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
2e00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
2e10: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
2e20: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
2e30: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
2e40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
2e50: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
2e60: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
2e70: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
2e80: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
2e90: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
2ea0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2eb0: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
2ec0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
2ed0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
2ee0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
2ef0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
2f00: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
2f10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f20: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
2f30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
2f40: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
2f50: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
2f60: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
2f70: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
2f80: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2f90: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 64  (USE_PREAD) || d
2fa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2fb0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2fc0: 4c 45 29 0a 20 20 7b 20 22 70 77 72 69 74 65 22  LE).  { "pwrite"
2fd0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2fe0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
2ff0: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3000: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3010: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3020: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3030: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3040: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3050: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
3060: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3070: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3080: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3090: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
30a0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
30b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
30c0: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
30d0: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
30e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30f0: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3100: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3110: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3120: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3130: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3140: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3150: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3160: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3170: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3180: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31a0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 33       aSyscall[13
31b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
31c0: 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20 20 20   "fchmod",      
31d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
31e0: 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20 20 20  l_ptr)fchmod,   
31f0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3200: 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e  osFchmod    ((in
3210: 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29  t(*)(int,mode_t)
3220: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
3230: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3240: 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
3250: 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
3260: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3270: 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74  TE.  { "fallocat
3280: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3290: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69  syscall_ptr)posi
32a0: 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20  x_fallocate,  0 
32b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61  },.#else.  { "fa
32c0: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
32d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
32e0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
32f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3300: 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63  #define osFalloc
3310: 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74  ate ((int(*)(int
3320: 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53  ,off_t,off_t))aS
3330: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
3340: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
3350: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
3360: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
3370: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
3380: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
3390: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
33a0: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
33b0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
33c0: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
33d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
33e0: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
33f0: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
3400: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
3410: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
3420: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
3430: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
3440: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
3450: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
3460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3470: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
3480: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
3490: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
34a0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
34b0: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
34c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
34d0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
34e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
34f0: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
3500: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
3510: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3520: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
3530: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
3540: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
3550: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
3560: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
3570: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3580: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3590: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
35a0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
35b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
35c0: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
35d0: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
35e0: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
35f0: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
3600: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
3610: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
3620: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3630: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
3640: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
3650: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
3660: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
3670: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
3680: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
3690: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
36a0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
36b0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
36c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
36d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
36e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
36f0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
3700: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
3710: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
3720: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
3730: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
3740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
3750: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
3760: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
3770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3780: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
3790: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
37a0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
37b0: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
37c0: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
37d0: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
37e0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
37f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3800: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
3810: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
3820: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
3830: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
3840: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
3850: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
3860: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
3870: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
3880: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
3890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
38a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
38b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
38d0: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
38e0: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
38f0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
3900: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
3910: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
3920: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
3930: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
3940: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
3950: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
3960: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
3970: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
3980: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
3990: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
39b0: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
39c0: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
39d0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
39e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
39f0: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
3a00: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
3a10: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
3a20: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
3a30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
3a40: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
3a50: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
3a60: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
3a70: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
3a80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3aa0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3ab0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
3ac0: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
3ad0: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
3ae0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
3af0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3b00: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
3b10: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
3b20: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
3b30: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
3b40: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
3b50: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
3b60: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
3b70: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
3b80: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3b90: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
3ba0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
3bb0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
3bc0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
3bd0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
3be0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
3bf0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
3c00: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
3c10: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
3c20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3c30: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
3c40: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
3c50: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
3c60: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
3c70: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
3c80: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
3c90: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
3ca0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
3cb0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
3cc0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3ce0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f 70 65 6e  /*.** Retry open
3cf0: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
3d00: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
3d10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
3d20: 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  bust_open(const 
3d30: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20  char *z, int f, 
3d40: 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74 20 72 63  int m){.  int rc
3d50: 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 4f  ;.  do{ rc = osO
3d60: 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d 77 68 69  pen(z,f,m); }whi
3d70: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
3d80: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65  o==EINTR );.  re
3d90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3da0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
3db0: 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
3dc0: 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
3dd0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
3de0: 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
3df0: 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
3e00: 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f  tect the unixIno
3e10: 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78  deInfo and.** vx
3e20: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
3e30: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
3e40: 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
3e50: 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73  ich may be .** s
3e60: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
3e70: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
3e80: 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75   Function unixMu
3e90: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
3ea0: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
3eb0: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
3ec0: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
3ed0: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
3ee0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3ef0: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
3f00: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
3f10: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
3f20: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45  g..**.**   unixE
3f30: 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
3f40: 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d     assert( unixM
3f50: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
3f60: 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76     unixEnterLeav
3f70: 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e().*/.static vo
3f80: 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  id unixEnterMute
3f90: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
3fa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
3fb0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
3fc0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
3fd0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
3fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
3ff0: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
4000: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
4010: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
4020: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
4030: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
4040: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
4050: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
4060: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
4070: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
4080: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4090: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
40a0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
40b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
40c0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
40d0: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
40e0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
40f0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
4100: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
4110: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
4120: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
4130: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
4140: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
4150: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
4160: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
4170: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
4180: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
4190: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
41a0: 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74   *azFileLock(int
41b0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73   eFileLock){.  s
41c0: 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b  witch( eFileLock
41d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f   ){.    case NO_
41e0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
41f0: 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48  NE";.    case SH
4200: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
4210: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20  n "SHARED";.    
4220: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
4230: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
4240: 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  RVED";.    case 
4250: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
4260: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
4270: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
4280: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
4290: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
42a0: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
42b0: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ";.}.#endif..#if
42c0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
42d0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
42e0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
42f0: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
4300: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
4310: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4320: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
4330: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
4340: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
4350: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
4360: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
4370: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
4380: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
4390: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
43a0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
43b0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
43c0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
43d0: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f  ally.** turned o
43e0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
43f0: 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20  t lockTrace(int 
4400: 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75  fd, int op, stru
4410: 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20  ct flock *p){.  
4420: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a  char *zOpName, *
4430: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a  zType;.  int s;.
4440: 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f    int savedErrno
4450: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45  ;.  if( op==F_GE
4460: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
4470: 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20  me = "GETLK";.  
4480: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f  }else if( op==F_
4490: 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  SETLK ){.    zOp
44a0: 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a  Name = "SETLK";.
44b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d    }else{.    s =
44c0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
44d0: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
44e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
44f0: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
4500: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
4510: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
4520: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
4530: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
4540: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
4550: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
4560: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4570: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
4580: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
4590: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
45a0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
45b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
45c0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
45d0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
45e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
45f0: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
4600: 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63  ET );.  s = osFc
4610: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
4620: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
4630: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
4640: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
4650: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
4660: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4670: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
4680: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
4690: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
46a0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
46b0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
46c0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
46d0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
46e0: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
46f0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
4700: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
4710: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
4720: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
4730: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46  l2 = *p;.    osF
4740: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b  cntl(fd, F_GETLK
4750: 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20  , &l2);.    if( 
4760: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  l2.l_type==F_RDL
4770: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4780: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20  e = "RDLCK";.   
4790: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
47a0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
47b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
47c0: 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  WRLCK";.    }els
47d0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
47e0: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
47f0: 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b    zType = "UNLCK
4800: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
4810: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
4820: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4830: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4840: 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61  cntl-failure-rea
4850: 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64  son: %s %d %d %d
4860: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70  \n",.       zTyp
4870: 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61  e, (int)l2.l_sta
4880: 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65  rt, (int)l2.l_le
4890: 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64  n, (int)l2.l_pid
48a0: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d  );.  }.  errno =
48b0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72   savedErrno;.  r
48c0: 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65  eturn s;.}.#unde
48d0: 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e  f osFcntl.#defin
48e0: 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72  e osFcntl lockTr
48f0: 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ace.#endif /* SQ
4900: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20  LITE_LOCK_TRACE 
4910: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  */../*.** Retry 
4920: 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  ftruncate() call
4930: 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20  s that fail due 
4940: 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74  to EINTR.*/.stat
4950: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
4960: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
4970: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
4980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
4990: 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61  { rc = osFtrunca
49a0: 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65  te(h,sz); }while
49b0: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
49c0: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
49d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
49e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
49f0: 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61  nslates a standa
4a00: 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63  rd POSIX errno c
4a10: 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69  ode into somethi
4a20: 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20  ng.** useful to 
4a30: 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74  the clients of t
4a40: 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74  he sqlite3 funct
4a50: 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61  ions.  Specifica
4a60: 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e  lly, it is.** in
4a70: 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c  tended to transl
4a80: 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66  ate a variety of
4a90: 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72   "try again" err
4aa0: 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f  ors into SQLITE_
4ab0: 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61  BUSY.** and a va
4ac0: 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65  riety of "please
4ad0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
4ae0: 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20  descriptor NOW" 
4af0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  errors into .** 
4b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20  SQLITE_IOERR.** 
4b10: 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e  .** Errors durin
4b20: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
4b30: 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69   of locks, or fi
4b40: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
4b50: 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t for locks,.** 
4b60: 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e  should handle EN
4b70: 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45  OLCK, ENOTSUP, E
4b80: 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61  OPNOTSUPP separa
4b90: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
4ba0: 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46  int sqliteErrorF
4bb0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  romPosixError(in
4bc0: 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e  t posixError, in
4bd0: 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b  t sqliteIOErr) {
4be0: 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78  .  switch (posix
4bf0: 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20  Error) {.#if 0. 
4c00: 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
4c10: 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e   this code was n
4c20: 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74  ot commented out
4c30: 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69  . In theory, thi
4c40: 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68  s branch.  ** sh
4c50: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69  ould never be hi
4c60: 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  t, as this funct
4c70: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
4c80: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a  be called after.
4c90: 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72    ** a locking-r
4ca0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  elated function 
4cb0: 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68  (i.e. fcntl()) h
4cc0: 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  as returned non-
4cd0: 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74  zero with.  ** t
4ce0: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e  he value of errn
4cf0: 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  o as the first a
4d00: 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61  rgument. Since a
4d10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73   system call has
4d20: 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72   failed,.  ** er
4d30: 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  rno should be no
4d40: 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  n-zero..  **.  *
4d50: 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20  * Despite this, 
4d60: 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20  if errno really 
4d70: 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c  is zero, we stil
4d80: 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  l don't want to 
4d90: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
4da0: 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65  TE_OK. The syste
4db0: 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61  m call failed, a
4dc0: 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65  nd *some* SQLite
4dd0: 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65   error should be
4de0: 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64  .  ** propagated
4df0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c   back to the cal
4e00: 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20  ler. Commenting 
4e10: 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20  this branch out 
4e20: 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20  means errno==0. 
4e30: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64   ** will be hand
4e40: 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61  led by the "defa
4e50: 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77  ult:" case below
4e60: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a  ..  */.  case 0:
4e70: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
4e80: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
4e90: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
4ea0: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
4eb0: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
4ec0: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
4ed0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
4ee0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
4ef0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
4f00: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
4f10: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
4f20: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
4f30: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
4f40: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
4f50: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
4f60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4f70: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
4f80: 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20  case EACCES: .  
4f90: 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c    /* EACCES is l
4fa0: 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e  ike EAGAIN durin
4fb0: 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  g locking operat
4fc0: 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e  ions, but not an
4fd0: 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20  y other time*/. 
4fe0: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f     if( (sqliteIO
4ff0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
5000: 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28  ERR_LOCK) || ..(
5010: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
5020: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
5030: 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65  CK) || ..(sqlite
5040: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
5050: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c  IOERR_RDLOCK) ||
5060: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5070: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
5080: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
5090: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
50a0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
50b0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
50c0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
50d0: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
50e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
50f0: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 63  E_PERM;.    .  c
5100: 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20 20  ase EDEADLK:.   
5110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
5120: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
5130: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
5140: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
5150: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
5160: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
5170: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
5180: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
5190: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
51a0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
51b0: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
51c0: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
51d0: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
51e0: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
51f0: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
5200: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
5210: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
5220: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
5230: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
5240: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
5250: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
5260: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
5270: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
5280: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
5290: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
52a0: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
52b0: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
52c0: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
52d0: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
52e0: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
52f0: 54 3a 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  T:.  case ESTALE
5300: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  :.  case ENOSYS:
5310: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
5320: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
5330: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
5340: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
5350: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
5360: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
5370: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
5380: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
5390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
53e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
53f0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
5400: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
5410: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
5420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5430: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
5440: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
5450: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
5460: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
5470: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
5480: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
5490: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
54a0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
54b0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
54c0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
54d0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
54e0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
54f0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
5500: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
5510: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
5520: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
5530: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5540: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5550: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
5560: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
5570: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
5580: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
5590: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
55a0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
55b0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
55c0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
55d0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
55e0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
55f0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
5600: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
5610: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
5620: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
5630: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
5640: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
5650: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
5660: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
5670: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
5680: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
5690: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
56a0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
56b0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
56c0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
56d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
56e0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
56f0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
5700: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
5710: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5720: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
5730: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
5740: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
5750: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
5760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5770: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
5780: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
5790: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
57c0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
57d0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
57e0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
57f0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
5800: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
5810: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
5820: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
5830: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
5840: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
5850: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
5860: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
5870: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
5880: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
5890: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
58a0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
58c0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
58d0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
58e0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
58f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
5900: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
5910: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
5920: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
5930: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
5940: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
5950: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
5960: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
5970: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
5980: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
5990: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
59a0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
59b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
59c0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
59d0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
59e0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
59f0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
5a00: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5a10: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
5a20: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
5a30: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
5a40: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
5a50: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
5a60: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
5a70: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
5a80: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
5a90: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
5aa0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
5ab0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
5ac0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
5ad0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
5ae0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5af0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
5b00: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
5b10: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
5b20: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
5b30: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5b40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5b50: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
5b60: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
5b70: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
5b80: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
5b90: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
5ba0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
5bb0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
5bc0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
5bd0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
5be0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5c00: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
5c10: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
5c20: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
5c30: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
5c40: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
5c50: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
5c60: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
5c70: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
5c80: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
5c90: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
5ca0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
5cb0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
5cc0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
5cd0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
5ce0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
5cf0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
5d00: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
5d10: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
5d20: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
5d30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5d40: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
5d50: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
5d60: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
5d70: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
5d80: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
5d90: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5da0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
5db0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
5dc0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
5dd0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
5de0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
5df0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
5e00: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
5e10: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
5e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
5e30: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
5e40: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
5e50: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5e60: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
5e70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
5e80: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
5e90: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
5ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ec0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
5ed0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
5ee0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
5ef0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
5f00: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
5f10: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
5f20: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
5f30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
5f40: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
5f50: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
5f60: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
5f70: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
5f80: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
5f90: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
5fa0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
5fb0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
5fc0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
5fd0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
5fe0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
5ff0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
6000: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
6010: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
6020: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
6030: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
6040: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
6050: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
6060: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6070: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
6080: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6090: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
60a0: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
60b0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
60c0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
60d0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
60e0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
60f0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
6100: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
6110: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
6120: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
6130: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
6140: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
6150: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
6160: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6170: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
6180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6190: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
61a0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
61b0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
61c0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
61d0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
61e0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
61f0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
6200: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
6210: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
6220: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
6230: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
6240: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
6250: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
6260: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
6270: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
6280: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
6290: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
62a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
62b0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
62c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
62d0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
62e0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
62f0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
6300: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
6310: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
6320: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
6330: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
6340: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
6350: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6360: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
6370: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
6380: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
6390: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
63a0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
63b0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
63c0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
63d0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
63e0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
63f0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
6400: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
6410: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
6420: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
6430: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
6440: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
6450: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6460: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
6470: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
6480: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
6490: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
64a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
64b0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
64c0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
64d0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
64f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65a0: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
65b0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
65c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
65e0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
65f0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
6600: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
6610: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
6620: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
6630: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
6640: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
6650: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
6660: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
6670: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
6680: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
6690: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
66a0: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
66b0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
66c0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
66d0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
66e0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
66f0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
6700: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
6710: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
6720: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
6730: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
6740: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6750: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
6760: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
6770: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
6780: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
6790: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
67a0: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
67b0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
67c0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
67d0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
67e0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
67f0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
6800: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
6810: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
6820: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
6830: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
6840: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
6850: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
6860: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
6870: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
6880: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
6890: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
68a0: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
68b0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
68c0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
68d0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
68e0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
68f0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
6900: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
6910: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
6920: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
6930: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
6940: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
6950: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
6960: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
6970: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
6980: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
6990: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
69a0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
69b0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
69c0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
69d0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
69e0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
69f0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
6a00: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
6a10: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
6a20: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
6a30: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
6a40: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
6a50: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
6a60: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
6a70: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
6a80: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
6a90: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
6aa0: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
6ab0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
6ac0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
6ad0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
6ae0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
6af0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
6b00: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
6b10: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
6b20: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
6b30: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
6b40: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
6b50: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
6b60: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
6b70: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
6b80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6b90: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
6ba0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6bb0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
6bc0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
6bd0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
6be0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
6bf0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
6c00: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
6c10: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
6c20: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
6c30: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
6c40: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
6c50: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
6c60: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
6c70: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
6c80: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
6c90: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
6ca0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
6cb0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
6cc0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
6cd0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
6ce0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
6cf0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
6d00: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
6d10: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
6d20: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
6d30: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
6d40: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
6d50: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
6d60: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
6d70: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
6d80: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
6d90: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
6da0: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
6db0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
6dc0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
6dd0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
6de0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
6df0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
6e00: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
6e10: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
6e20: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
6e30: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
6e40: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
6e50: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
6e60: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
6e70: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
6e80: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
6e90: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
6ea0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
6eb0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
6ec0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
6ed0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
6ee0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
6ef0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
6f00: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
6f10: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
6f20: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
6f30: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
6f40: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
6f50: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
6f60: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
6f70: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
6f80: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
6f90: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
6fa0: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
6fb0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
6fc0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
6fd0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
6fe0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
6ff0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
7000: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
7010: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
7020: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7030: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
7040: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
7050: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
7060: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
7070: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
7080: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
7090: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
70a0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
70b0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
70c0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
70d0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
70e0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
70f0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
7100: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
7110: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
7120: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
7130: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
7140: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
7150: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
7160: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
7170: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
7180: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
7190: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
71a0: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
71b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
71c0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
71d0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
71e0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
71f0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
7200: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
7210: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
7220: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
7230: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
7240: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
7250: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
7260: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
7270: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
7280: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7290: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
72a0: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
72b0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
72c0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
72d0: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
72e0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
72f0: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
7300: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
7310: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
7320: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
7330: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
7340: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
7350: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
7360: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
7370: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
7380: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
7390: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
73a0: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
73b0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
73c0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
73d0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
73e0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
73f0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
7400: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
7410: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
7420: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
7430: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
7440: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
7450: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
7460: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
7470: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
7480: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
7490: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
74a0: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
74b0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
74c0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
74d0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
74e0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
74f0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
7500: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
7510: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
7520: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
7530: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
7540: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
7550: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
7560: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
7570: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
7580: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
7590: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
75a0: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
75b0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
75c0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
75d0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
75e0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
75f0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
7600: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
7610: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
7620: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
7630: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
7640: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
7650: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
7660: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
7670: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
7680: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7690: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
76a0: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
76b0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
76c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
76d0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
76e0: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
76f0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
7700: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
7710: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
7720: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
7730: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
7740: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
7750: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
7760: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
7770: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
7780: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
7790: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
77a0: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
77b0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
77c0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
77d0: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
77e0: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
77f0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7800: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
7810: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7820: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
7830: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
7840: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7850: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
7860: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
7870: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
7880: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7890: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
78a0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
78b0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
78c0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
78d0: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
78e0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
78f0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
7900: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7920: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
7930: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
7940: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
7950: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
7960: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
7970: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
7980: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
7990: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
79a0: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
79b0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
79c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
79d0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
79e0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
79f0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
7a00: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
7a10: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
7a20: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
7a30: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
7a40: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
7a50: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
7a60: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
7a70: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
7a80: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
7a90: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
7aa0: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
7ab0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
7ac0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
7ad0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
7ae0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
7af0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
7b00: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
7b10: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
7b20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
7b30: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
7b40: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
7b50: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
7b60: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
7b70: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
7b80: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
7b90: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
7ba0: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
7bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7bc0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
7bd0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
7be0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
7bf0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
7c00: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
7c10: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
7c20: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
7c30: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
7c40: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
7c50: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
7c60: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
7c70: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
7c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ca0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
7cb0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7cc0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
7cd0: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
7ce0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
7cf0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
7d00: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
7d10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d40: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
7d50: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
7d60: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
7d70: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
7d80: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
7d90: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
7da0: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
7db0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
7dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
7dd0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
7de0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
7df0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
7e00: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
7e10: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
7e20: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
7e30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7e40: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
7e50: 53 54 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65  STYLE).  unsigne
7e60: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
7e70: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
7e80: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
7e90: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
7ea0: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
7eb0: 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  KS.  sem_t *pSem
7ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ed0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f       /* Named PO
7ee0: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  SIX semaphore */
7ef0: 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65  .  char aSemName
7f00: 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
7f10: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
7f20: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
7f30: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
7f40: 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20   A lists of all 
7f50: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
7f60: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
7f70: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
7f80: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  inodeList = 0;..
7f90: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
7fa0: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
7fb0: 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e  Error_x(), is on
7fc0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
7fd0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
7fe0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
7ff0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
8000: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
8010: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
8020: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
8030: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
8040: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
8050: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
8060: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
8070: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
8080: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
8090: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
80a0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
80b0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
80c0: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
80d0: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
80e0: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
80f0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
8100: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
8110: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
8120: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
8130: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
8140: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
8150: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
8160: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
8170: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
8180: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
8190: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
81a0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
81b0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
81c0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
81d0: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
81e0: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
81f0: 64 20 74 68 65 20 74 68 65 20 61 73 73 6f 63 69  d the the associ
8200: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
8210: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
8220: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
8230: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
8240: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
8250: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
8260: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
8270: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
8280: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
8290: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
82a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
82b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
82c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
82d0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
82e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
82f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
8300: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
8310: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
8320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8330: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
8340: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
8350: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
8380: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
8390: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
83a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
83b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
83c0: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
83d0: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
83e0: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
83f0: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
8400: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
8410: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
8420: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
8430: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
8440: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
8450: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
8460: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
8470: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
8480: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
8490: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
84a0: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
84b0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
84c0: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
84d0: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
84e0: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
84f0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
8500: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
8510: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
8520: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
8530: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
8540: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
8550: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
8560: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
8570: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
8580: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
8590: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
85a0: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
85b0: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
85c0: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
85d0: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
85e0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 74 68 65  provides the the
85f0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
8600: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
8610: 74 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  t .  ** returns 
8620: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
8630: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
8640: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
8650: 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72  ge. That pointer
8660: 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74   .  ** may point
8670: 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69   to aErr[], or i
8680: 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73  t may point to s
8690: 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61  ome static stora
86a0: 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20  ge somewhere. . 
86b0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
86c0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
86d0: 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74  ystem provides t
86e0: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
86f0: 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72   of .  ** strerr
8700: 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c  or_r(), which al
8710: 77 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65  ways writes an e
8720: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
8730: 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20  o aErr[]..  **. 
8740: 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20   ** If the code 
8750: 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75  incorrectly assu
8760: 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74  mes that it is t
8770: 68 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e  he POSIX version
8780: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76   that is.  ** av
8790: 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72  ailable, the err
87a0: 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
87b0: 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74  often be an empt
87c0: 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a  y string. Not a.
87d0: 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65    ** huge proble
87e0: 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63  m. Incorrectly c
87f0: 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74  oncluding that t
8800: 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69  he GNU version i
8810: 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a  s available .  *
8820: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
8830: 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67  a segfault thoug
8840: 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  h..  */.#if defi
8850: 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43  ned(STRERROR_R_C
8860: 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65  HAR_P) || define
8870: 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a  d(__USE_GNU).  z
8880: 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20  Err = .# endif. 
8890: 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72   strerror_r(iErr
88a0: 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66  no, aErr, sizeof
88b0: 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69  (aErr)-1);..#eli
88c0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
88d0: 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  AFE.  /* This is
88e0: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
88f0: 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f  ild, but strerro
8900: 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61  r_r() is not ava
8910: 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72  ilable. */.  zEr
8920: 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20  r = "";.#else.  
8930: 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66  /* Non-threadsaf
8940: 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72  e build, use str
8950: 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45  error(). */.  zE
8960: 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45  rr = strerror(iE
8970: 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  rrno);.#endif.. 
8980: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
8990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
89a0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
89b0: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71  zPath = "";.  sq
89c0: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
89d0: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69  e,.      "os_uni
89e0: 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28  x.c:%d: (%d) %s(
89f0: 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20  %s) - %s",.     
8a00: 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20   iLine, iErrno, 
8a10: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45  zFunc, zPath, zE
8a20: 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  rr.  );..  retur
8a30: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
8a40: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
8a50: 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a   descriptor..**.
8a60: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61  ** We assume tha
8a70: 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74  t close() almost
8a80: 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73   always works, s
8a90: 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20  ince it is only 
8aa0: 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63  in a.** very sic
8ab0: 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72  k application or
8ac0: 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20   on a very sick 
8ad0: 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74  platform that it
8ae0: 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20   might fail..** 
8af0: 49 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c  If it does fail,
8b00: 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65   simply leak the
8b10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8b20: 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65  , but do log the
8b30: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
8b40: 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73   Note that it is
8b50: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74   not safe to ret
8b60: 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72  ry close() after
8b70: 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65   EINTR since the
8b80: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
8b90: 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61  tor might have a
8ba0: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73  lready been reus
8bb0: 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68  ed by another th
8bc0: 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64  read..** So we d
8bd0: 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f  on't even try to
8be0: 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e   recover from an
8bf0: 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f   EINTR.  Just lo
8c00: 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61  g the error.** a
8c10: 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73  nd move on..*/.s
8c20: 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73  tatic void robus
8c30: 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65  t_close(unixFile
8c40: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20   *pFile, int h, 
8c50: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69  int lineno){.  i
8c60: 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b  f( osClose(h) ){
8c70: 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
8c80: 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49  rAtLine(SQLITE_I
8c90: 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f  OERR_CLOSE, "clo
8ca0: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se",.           
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
8cc0: 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e ? pFile->zPath
8cd0: 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20   : 0, lineno);. 
8ce0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
8cf0: 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  e all file descr
8d00: 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65  iptors accumuate
8d10: 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  d in the unixIno
8d20: 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20  deInfo->pUnused 
8d30: 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  list..*/ .static
8d40: 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69   void closePendi
8d50: 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a  ngFds(unixFile *
8d60: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
8d70: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
8d80: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
8d90: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8da0: 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  *p;.  UnixUnused
8db0: 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  Fd *pNext;.  for
8dc0: 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  (p=pInode->pUnus
8dd0: 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ed; p; p=pNext){
8de0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
8df0: 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73  pNext;.    robus
8e00: 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
8e10: 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  ->fd, __LINE__);
8e20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8e30: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f  e(p);.  }.  pIno
8e40: 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  de->pUnused = 0;
8e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
8e60: 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  e a unixInodeInf
8e70: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
8e80: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
8e90: 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   by findInodeInf
8ea0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  o()..**.** The m
8eb0: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
8ec0: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
8ed0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
8ee0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
8ef0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
8f00: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
8f10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
8f20: 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75  leaseInodeInfo(u
8f30: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
8f40: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8f50: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
8f60: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
8f70: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
8f80: 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  d() );.  if( ALW
8f90: 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20  AYS(pInode) ){. 
8fa0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d     pInode->nRef-
8fb0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
8fc0: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
8fd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
8fe0: 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  de->pShmNode==0 
8ff0: 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65  );.      closePe
9000: 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
9010: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
9020: 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  e->pPrev ){.    
9030: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
9040: 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  de->pPrev->pNext
9050: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
9060: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
9070: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  v->pNext = pInod
9080: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
9090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
90a0: 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74  ssert( inodeList
90b0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
90c0: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
90d0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
90e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
90f0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29   pInode->pNext )
9100: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9110: 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d  ( pInode->pNext-
9120: 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29  >pPrev==pInode )
9130: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
9140: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
9150: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a   pInode->pPrev;.
9160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9170: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
9180: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
9190: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
91a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
91b0: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
91c0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
91d0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
91e0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
91f0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
9200: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9210: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
9220: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
9230: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
9240: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
9250: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
9260: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
9270: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
9280: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
9290: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
92a0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
92b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
92c0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
92d0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
92e0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
92f0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
9300: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
9310: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
9320: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
9330: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
9340: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
9350: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
9360: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
9370: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9380: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
9390: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
93a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
93d0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
93e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
9410: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
9420: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
9430: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
9440: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
9450: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
9460: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9470: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
9480: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
9490: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
94a0: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
94b0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
94c0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
94d0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
94e0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
94f0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
9500: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
9510: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
9520: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
9530: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
9540: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
9550: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
9560: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
9570: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
9580: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
9590: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
95a0: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
95b0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
95c0: 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
95d0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
95e0: 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  no;.#ifdef EOVER
95f0: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
9600: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
9610: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
9620: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
9630: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
9640: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
9650: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
9660: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
9670: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
9680: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
9690: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
96a0: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
96b0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
96c0: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
96d0: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
96e0: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
96f0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
9700: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
9710: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
9720: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
9730: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
9740: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
9750: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
9760: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
9770: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
9780: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
9790: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
97a0: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
97b0: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
97c0: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
97d0: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
97e0: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
97f0: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
9800: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
9810: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
9820: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
9830: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
9840: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
9850: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
9860: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
9870: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
9880: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
9890: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
98a0: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
98b0: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
98c0: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
98d0: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
98e0: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
98f0: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
9900: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
9910: 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72     do{ rc = osWr
9920: 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b  ite(fd, "S", 1);
9930: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
9940: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
9950: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29  .    if( rc!=1 )
9960: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
9970: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
9980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
9990: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
99a0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
99b0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
99c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
99d0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
99e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
99f0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
9a00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
9a10: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
9a20: 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49  .  memset(&fileI
9a30: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c  d, 0, sizeof(fil
9a40: 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e  eId));.  fileId.
9a50: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
9a60: 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57  _dev;.#if OS_VXW
9a70: 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49  ORKS.  fileId.pI
9a80: 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a  d = pFile->pId;.
9a90: 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69  #else.  fileId.i
9aa0: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
9ab0: 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49  ino;.#endif.  pI
9ac0: 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
9ad0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64  ;.  while( pInod
9ae0: 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c  e && memcmp(&fil
9af0: 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69  eId, &pInode->fi
9b00: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
9b10: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e  eId)) ){.    pIn
9b20: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
9b30: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
9b40: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
9b50: 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  pInode = sqlite3
9b60: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
9b70: 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20  *pInode) );.    
9b80: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
9b90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9ba0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9bb0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e  }.    memset(pIn
9bc0: 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
9bd0: 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65  pInode));.    me
9be0: 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69  mcpy(&pInode->fi
9bf0: 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73  leId, &fileId, s
9c00: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
9c10: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
9c20: 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65   = 1;.    pInode
9c30: 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c  ->pNext = inodeL
9c40: 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ist;.    pInode-
9c50: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
9c60: 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20  if( inodeList ) 
9c70: 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76  inodeList->pPrev
9c80: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69   = pInode;.    i
9c90: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
9ca0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
9cb0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pInode->nRef++;.
9cc0: 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d    }.  *ppInode =
9cd0: 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72   pInode;.  retur
9ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9cf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9d00: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
9d10: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
9d20: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
9d30: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
9d40: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
9d50: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
9d60: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
9d70: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
9d80: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
9d90: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
9da0: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
9db0: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
9dc0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
9dd0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
9de0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
9df0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
9e00: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
9e10: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
9e20: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
9e30: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
9e40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
9e50: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
9e60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9e70: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
9e80: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
9e90: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9ea0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
9eb0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
9ec0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
9ed0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
9ee0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
9ef0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
9f00: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
9f10: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
9f20: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
9f30: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
9f40: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
9f50: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
9f60: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9f70: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9f80: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9f90: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
9fa0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
9fb0: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
9fc0: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
9fd0: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
9fe0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
9ff0: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
a000: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
a010: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
a020: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
a030: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
a040: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
a050: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
a060: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
a070: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
a080: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a090: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
a0a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a0b0: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
a0c0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
a0d0: 20 20 69 66 20 28 2d 31 20 3d 3d 20 6f 73 46 63    if (-1 == osFc
a0e0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a0f0: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b  GETLK, &lock)) {
a100: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
a110: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
a120: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
a130: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
a140: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
a150: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
a160: 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  EDLOCK);.      p
a170: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
a180: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 20  = tErrno;.    } 
a190: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
a1a0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
a1b0: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
a1c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
a1d0: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
a1e0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
a1f0: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
a200: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
a210: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
a220: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
a230: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
a240: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
a250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a260: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
a270: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
a280: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
a290: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
a2a0: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
a2b0: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
a2c0: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
a2d0: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
a2e0: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
a2f0: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
a300: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
a310: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
a320: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
a330: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
a340: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
a350: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
a360: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
a370: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
a380: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
a390: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
a3a0: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
a3b0: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
a3c0: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
a3d0: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
a3e0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
a3f0: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
a400: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
a410: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a420: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
a430: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
a440: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
a450: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
a460: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
a470: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
a480: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
a490: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
a4a0: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
a4b0: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
a4c0: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
a4d0: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
a4e0: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
a4f0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
a500: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
a510: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
a520: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
a530: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
a540: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
a550: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
a560: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
a570: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
a580: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
a590: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
a5a0: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
a5b0: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
a5c0: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
a5d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
a5e0: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
a5f0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
a600: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  t flock *pLock){
a610: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
a620: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
a630: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
a640: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
a650: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
a660: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
a670: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  e!=0 );.  if( ((
a680: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
a690: 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c   & UNIXFILE_EXCL
a6a0: 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  )!=0 || pInode->
a6b0: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20  bProcessLock).  
a6c0: 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72   && ((pFile->ctr
a6d0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
a6e0: 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20  E_RDONLY)==0).  
a6f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  ){.    if( pInod
a700: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
a710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
a720: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
a730: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a740: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b  ode->nLock==0 );
a750: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
a760: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a770: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
a780: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
a790: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
a7a0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
a7b0: 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ZE;.      lock.l
a7c0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
a7d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63  .      rc = osFc
a7e0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
a7f0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
a800: 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20       if( rc<0 ) 
a810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
a820: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
a830: 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  sLock = 1;.     
a840: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
a850: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a860: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
a870: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
a880: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
a890: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
a8a0: 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ock);.  }.  retu
a8b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a8c0: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
a8d0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
a8e0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
a8f0: 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
a900: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
a910: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
a920: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
a930: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
a940: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
a950: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
a960: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
a970: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
a980: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
a990: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
a9a0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
a9b0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
a9c0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
a9d0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
a9e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
a9f0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
aa00: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
aa10: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
aa20: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
aa30: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
aa40: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
aa50: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
aa60: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
aa70: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
aa80: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
aa90: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
aaa0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
aab0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
aac0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
aad0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
aae0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
aaf0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
ab00: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
ab10: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
ab20: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
ab30: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
ab40: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
ab50: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
ab60: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
ab70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ab80: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
ab90: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
aba0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
abb0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
abc0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
abd0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
abe0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
abf0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
ac00: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
ac10: 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  k){.  /* The fol
ac20: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
ac30: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
ac40: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
ac50: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
ac60: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
ac70: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
ac80: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
ac90: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
aca0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
acb0: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
acc0: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
acd0: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
ace0: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
acf0: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
ad00: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
ad10: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
ad20: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
ad30: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
ad40: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
ad50: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
ad60: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
ad70: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
ad80: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
ad90: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ada0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
adb0: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
adc0: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
add0: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
ade0: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
adf0: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
ae00: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
ae10: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
ae20: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
ae30: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
ae40: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
ae50: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
ae60: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
ae70: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
ae80: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
ae90: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
aea0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
aeb0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
aec0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
aed0: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
aee0: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
aef0: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
af00: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
af10: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
af20: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
af30: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
af40: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
af50: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
af60: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
af70: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
af80: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
af90: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
afa0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
afb0: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
afc0: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
afd0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
afe0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
aff0: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
b000: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
b010: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
b020: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
b030: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
b040: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
b050: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
b060: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
b070: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
b080: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
b090: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
b0a0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
b0b0: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
b0c0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
b0d0: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
b0e0: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
b0f0: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
b100: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
b110: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
b120: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
b130: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
b140: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
b150: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
b160: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
b170: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
b180: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
b190: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
b1a0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
b1b0: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
b1c0: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
b1d0: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
b1e0: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
b1f0: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
b200: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
b210: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
b220: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
b230: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
b240: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
b250: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
b260: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
b270: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
b280: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
b290: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
b2a0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
b2b0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
b2c0: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
b2d0: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
b2e0: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
b2f0: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
b300: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
b310: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
b320: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
b330: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
b340: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
b350: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
b360: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
b370: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b380: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
b390: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
b3a0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
b3b0: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
b3c0: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
b3d0: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
b3e0: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
b3f0: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
b400: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
b410: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
b420: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
b430: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
b440: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
b450: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b460: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
b470: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
b480: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
b490: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
b4a0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
b4b0: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
b4c0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
b4d0: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
b4e0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
b4f0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
b500: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
b510: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
b520: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
b530: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
b540: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
b550: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
b560: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
b570: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
b580: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
b590: 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
b5a0: 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
b5b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b5c0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
b5d0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
b5e0: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
b5f0: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
b600: 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
b610: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
b620: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
b630: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
b640: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
b650: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
b660: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
b670: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
b680: 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
b690: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
b6a0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
b6b0: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
b6c0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
b6d0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
b6e0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
b6f0: 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
b700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b710: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
b720: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
b730: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
b740: 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57  ect..  **  (1) W
b750: 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
b760: 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
b770: 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
b780: 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
b790: 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
b7a0: 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
b7b0: 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
b7c0: 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
b7d0: 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
b7e0: 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
b7f0: 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
b800: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
b810: 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
b820: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
b830: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
b840: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
b850: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b860: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
b870: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
b880: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
b890: 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
b8a0: 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
b8b0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b8c0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
b8d0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
b8e0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
b8f0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
b900: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
b910: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
b920: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
b930: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
b940: 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  ;..  /* If some 
b950: 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
b960: 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b  s PID has a lock
b970: 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74   via a different
b980: 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20   unixFile*.  ** 
b990: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
b9a0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
b9b0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
b9c0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
b9d0: 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ( (pFile->eFileL
b9e0: 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69  ock!=pInode->eFi
b9f0: 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20  leLock && .     
ba00: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
ba10: 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
ba20: 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
ba30: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
ba40: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
ba50: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ba60: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
ba70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48   }..  /* If a SH
ba80: 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71  ARED lock is req
ba90: 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65  uested, and some
baa0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
bab0: 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20  is PID already. 
bac0: 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44   ** has a SHARED
bad0: 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63   or RESERVED loc
bae0: 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  k, then incremen
baf0: 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  t reference coun
bb00: 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  ts and.  ** retu
bb10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
bb20: 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
bb30: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bb40: 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64  && .      (pInod
bb50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
bb60: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
bb70: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
bb80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
bb90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
bba0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
bbb0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
bbc0: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
bbd0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
bbe0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
bbf0: 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
bc00: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
bc10: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
bc20: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
bc30: 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
bc40: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
bc50: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
bc60: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44   }...  /* A PEND
bc70: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
bc80: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
bc90: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
bca0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
bcb0: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
bcc0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
bcd0: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
bce0: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
bcf0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
bd00: 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c  leased..  */.  l
bd10: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
bd20: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
bd30: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66  = SEEK_SET;.  if
bd40: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
bd50: 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
bd60: 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
bd70: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
bd80: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
bd90: 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
bda0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
bdb0: 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63  type = (eFileLoc
bdc0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  k==SHARED_LOCK?F
bdd0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
bde0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
bdf0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
be00: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
be10: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
be20: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
be30: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
be40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
be50: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
be60: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
be70: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
be80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
be90: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
bea0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
beb0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
bec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
bed0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
bee0: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
bef0: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
bf00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
bf10: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
bf20: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
bf30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
bf40: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
bf50: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
bf60: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
bf70: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
bf80: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
bf90: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
bfa0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
bfb0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
bfc0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
bfd0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
bfe0: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
bff0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
c000: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
c010: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
c020: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
c030: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
c040: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
c050: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
c060: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
c070: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
c080: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
c090: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
c0a0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
c0b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
c0c0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
c0d0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
c0e0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
c0f0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
c100: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
c110: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
c120: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
c130: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
c140: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
c150: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
c160: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
c170: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c180: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
c190: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
c1a0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
c1b0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c1c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c1d0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c1e0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c1f0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c200: 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 7d  _UNLOCK); .    }
c210: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
c220: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c230: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c240: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c250: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
c260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c270: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
c280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
c290: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
c2a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c2b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c2c0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
c2d0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
c2e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c2f0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
c300: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
c310: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
c320: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
c330: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
c340: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
c350: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
c360: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
c370: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
c380: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
c390: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
c3a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c3b0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
c3c0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
c3d0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
c3e0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
c3f0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
c400: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
c410: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
c420: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
c430: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
c440: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
c450: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c460: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
c470: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
c480: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
c490: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
c4a0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
c4b0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c4c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
c4d0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
c4e0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
c4f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
c500: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
c510: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
c520: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
c530: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
c540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
c550: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
c560: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
c570: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
c580: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
c590: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
c5a0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
c5b0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
c5c0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
c5d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
c5e0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
c5f0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
c600: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
c610: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c620: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
c630: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
c640: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
c650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c660: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
c670: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
c680: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
c690: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
c6a0: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
c6b0: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
c6c0: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
c6d0: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
c6e0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
c6f0: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
c700: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
c710: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
c720: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
c730: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
c740: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
c750: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
c760: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
c770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
c780: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
c790: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
c7a0: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
c7b0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
c7c0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
c7d0: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
c7e0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
c7f0: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
c800: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
c810: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
c820: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
c830: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c840: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
c850: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
c860: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
c870: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
c880: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
c890: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
c8a0: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
c8b0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
c8c0: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
c8d0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
c8e0: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
c8f0: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
c900: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
c910: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
c920: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
c930: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
c940: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
c950: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
c960: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
c970: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
c980: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
c990: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c9a0: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
c9b0: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
c9c0: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
c9d0: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
c9e0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
c9f0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
ca00: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
ca10: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
ca20: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
ca30: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
ca40: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
ca50: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
ca60: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
ca70: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
ca80: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
ca90: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
caa0: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
cab0: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
cac0: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
cad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
cae0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
caf0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
cb00: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
cb10: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
cb20: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
cb30: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
cb40: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
cb50: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
cb60: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
cb70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cb80: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
cb90: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
cba0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
cbb0: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
cbc0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
cbd0: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
cbe0: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
cbf0: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
cc00: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
cc10: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
cc20: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
cc30: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
cc40: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
cc50: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
cc60: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
cc70: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
cc80: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
cc90: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
cca0: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
ccb0: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
ccc0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
ccd0: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
cce0: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
ccf0: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
cd00: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
cd10: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
cd20: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
cd30: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
cd40: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
cd50: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
cd60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
cd70: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
cd80: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
cd90: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
cda0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
cdb0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
cdc0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cdd0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
cde0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
cdf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ce00: 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74 45   int h;.  int tE
ce10: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
ce20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
ce30: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
ce40: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
ce50: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ce60: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
ce70: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
ce80: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
ce90: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
cea0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
ceb0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
cec0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
ced0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
cee0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
cef0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
cf00: 0a 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29  .      getpid())
cf10: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
cf20: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
cf30: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
cf40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
cf50: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cf60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cf70: 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
cf80: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
cf90: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 49 6e   pFile->h;.  pIn
cfa0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
cfb0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
cfc0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
cfd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
cfe0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
cff0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
d000: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
d010: 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
d020: 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
d030: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d040: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
d050: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
d060: 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
d070: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
d080: 69 67 6e 28 30 29 3b 0a 0a 23 69 66 6e 64 65 66  ign(0);..#ifndef
d090: 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57   NDEBUG.    /* W
d0a0: 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
d0b0: 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
d0c0: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
d0d0: 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
d0e0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
d0f0: 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
d100: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
d110: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
d120: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
d130: 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
d140: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
d150: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
d160: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
d170: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
d180: 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
d190: 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
d1a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
d1b0: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
d1c0: 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
d1d0: 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
d1e0: 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
d1f0: 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
d200: 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
d210: 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
d220: 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
d230: 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
d240: 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
d250: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
d260: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ion..    */.#if 
d270: 30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  0.    assert( pF
d280: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
d290: 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  te==0.         |
d2a0: 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
d2b0: 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  e==0.         ||
d2c0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
d2d0: 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 23 65 6e 64  rChng==1 );.#end
d2e0: 69 66 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  if.    pFile->in
d2f0: 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
d300: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d310: 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
d320: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
d330: 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
d340: 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
d350: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
d360: 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
d370: 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
d380: 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
d390: 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
d3a0: 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
d3b0: 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
d3c0: 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
d3d0: 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
d3e0: 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
d3f0: 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
d400: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
d410: 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
d420: 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
d430: 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
d440: 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
d450: 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
d460: 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
d470: 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
d480: 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
d490: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
d4a0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66  RED_LOCK ){..#if
d4b0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
d4c0: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
d4d0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
d4e0: 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
d4f0: 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
d500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d510: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
d520: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
d530: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
d540: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
d550: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
d560: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
d570: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
d580: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69          off_t di
d590: 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53  vSize = SHARED_S
d5a0: 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  IZE - 1;.       
d5b0: 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   .        lock.l
d5c0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
d5d0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d5e0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d5f0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d600: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d610: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
d620: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
d630: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
d640: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
d650: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
d660: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
d670: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d680: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
d690: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d6a0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d6b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d6c0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
d6d0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d6e0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d6f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d700: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d710: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d720: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
d730: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
d740: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
d750: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
d760: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d770: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d780: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d790: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d7a0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
d7b0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76  lock.l_len = div
d7c0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
d7d0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
d7e0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
d7f0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
d800: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d810: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
d820: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
d830: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
d840: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
d850: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
d860: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d870: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d880: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
d890: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d8b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
d8c0: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
d8d0: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
d8e0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
d8f0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
d900: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d910: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d920: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d930: 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
d940: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d950: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d960: 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
d970: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
d980: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
d990: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
d9a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d9b0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
d9c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
d9d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
d9e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
d9f0: 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
da00: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
da10: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
da20: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
da30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
da40: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
da50: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
da60: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
da70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
da80: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  e.#endif /* defi
da90: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
daa0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
dab0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
dac0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
dad0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
dae0: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
daf0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
db00: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
db10: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
db20: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
db30: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
db40: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
db50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
db60: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
db70: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
db80: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
db90: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
dba0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
dbb0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
dbc0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
dbd0: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
dbe0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
dbf0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
dc00: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
dc10: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
dc20: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
dc30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
dc40: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
dc50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dc60: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
dc70: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
dc80: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
dc90: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
dca0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
dcb0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
dcc0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
dcd0: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
dce0: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
dcf0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
dd00: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
dd10: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
dd20: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
dd30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
dd40: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
dd50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72  }else{.      tEr
dd60: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dd70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dd80: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dd90: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dda0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
ddb0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ddc0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
ddd0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
dde0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
ddf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
de00: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
de10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
de20: 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
de30: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
de40: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
de50: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
de60: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
de70: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
de80: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
de90: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
dea0: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
deb0: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
dec0: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
ded0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
dee0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
def0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
df00: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
df10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
df20: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
df30: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
df40: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
df50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
df60: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
df70: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
df80: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
df90: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
dfa0: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
dfb0: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
dfc0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
dfd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
dfe0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
dff0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
e000: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
e010: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
e020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e030: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
e040: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
e050: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
e060: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
e070: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
e080: 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
e090: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e0a0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
e0b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
e0c0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
e0d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e0e0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
e0f0: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
e100: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
e110: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
e120: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
e130: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
e140: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
e150: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
e160: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
e170: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
e180: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
e190: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
e1a0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
e1b0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
e1c0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
e1d0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
e1e0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
e1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
e200: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
e210: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e220: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
e230: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
e240: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
e250: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
e260: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
e270: 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a  }...end_unlock:.
e280: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
e290: 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
e2a0: 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
e2b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
e2c0: 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
e2d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
e2e0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
e2f0: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
e300: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
e310: 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
e320: 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
e330: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
e340: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
e350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
e360: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
e370: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
e380: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
e390: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
e3a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
e3b0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
e3c0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
e3d0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
e3e0: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
e3f0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e400: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
e410: 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
e420: 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
e430: 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k, 0);.}../*.** 
e440: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
e450: 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
e460: 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
e470: 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
e480: 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
e490: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
e4a0: 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
e4b0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
e4c0: 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
e4d0: 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
e4e0: 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
e4f0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
e500: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
e510: 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
e520: 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
e530: 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
e540: 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
e550: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e560: 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
e570: 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
e580: 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
e590: 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
e5a0: 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
e5b0: 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
e5c0: 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
e5d0: 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
e5e0: 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
e5f0: 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
e600: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e610: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
e620: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
e630: 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
e640: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
e650: 3e 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  >dirfd, __LINE__
e660: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69  );.    pFile->di
e670: 72 66 64 3d 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  rfd=-1;.  }.  if
e680: 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
e690: 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
e6a0: 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
e6b0: 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
e6c0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
e6d0: 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
e6e0: 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
e6f0: 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
e700: 70 46 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20  pFile->isDelete 
e710: 29 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28  ){.      unlink(
e720: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
e730: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
e740: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
e750: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
e760: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
e770: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
e780: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
e790: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
e7a0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
e7b0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
e7c0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
e7d0: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
e7e0: 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
e7f0: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
e800: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
e810: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e820: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
e830: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
e840: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
e850: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
e860: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e870: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
e880: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e890: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
e8a0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
e8b0: 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
e8c0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
e8d0: 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
e8e0: 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
e8f0: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
e900: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
e910: 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
e920: 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
e930: 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
e940: 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
e950: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
e960: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
e970: 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
e980: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
e990: 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
e9a0: 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
e9b0: 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
e9c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
e9d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
e9e0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
e9f0: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
ea00: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
ea10: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
ea20: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
ea30: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
ea40: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
ea50: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
ea60: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
ea70: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
ea80: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
ea90: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
eaa0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
eab0: 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
eac0: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
ead0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
eae0: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
eaf0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
eb00: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
eb10: 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
eb20: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
eb30: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
eb40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
eb50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
eb60: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
eb70: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
eb80: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
eb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eba0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
ebb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebf0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
ec00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
ec50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec60: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
ec70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec90: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
eca0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
ecb0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
ecc0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
ecd0: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
ece0: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
ecf0: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
ed00: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
ed10: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
ed20: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
ed30: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
ed40: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
ed50: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
ed60: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
ed70: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
ed80: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
ed90: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
eda0: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
edb0: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
edc0: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
edd0: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
ede0: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
edf0: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
ee00: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
ee10: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
ee20: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
ee30: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
ee40: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
ee50: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
ee60: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ee70: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
ee80: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
ee90: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
eea0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
eeb0: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
eec0: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
eed0: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
eee0: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
eef0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
ef00: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
ef10: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
ef20: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
ef30: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
ef40: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
ef50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
ef60: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
ef70: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
ef80: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
ef90: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
efa0: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
efb0: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
efc0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
efd0: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
efe0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
eff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f000: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
f010: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
f020: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
f030: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
f040: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
f050: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
f060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f070: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
f080: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
f090: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f0a0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f0b0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f0c0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f0d0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f0f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
f100: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f110: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
f120: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f130: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
f140: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
f150: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f160: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f170: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
f180: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1f0: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f240: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
f260: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
f270: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f290: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
f2a0: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
f2b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
f2c0: 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
f2d0: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
f2e0: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
f2f0: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
f300: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
f310: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
f320: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
f330: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
f340: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
f350: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
f360: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
f370: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
f380: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
f390: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
f3a0: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
f3b0: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
f3c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
f3d0: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
f3e0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
f3f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
f400: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
f410: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
f420: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
f430: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
f440: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
f450: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
f460: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
f470: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
f480: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
f490: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
f4a0: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
f4b0: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
f4c0: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
f4d0: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
f4e0: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
f4f0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
f500: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
f510: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
f520: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
f530: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
f540: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
f550: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
f560: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
f570: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
f580: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
f590: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
f5a0: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
f5b0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
f5c0: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
f5d0: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
f5e0: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
f5f0: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
f600: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
f610: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
f620: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
f630: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
f640: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
f650: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
f660: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
f670: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
f680: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
f690: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
f6a0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
f6b0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
f6c0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
f6d0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
f6e0: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
f6f0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
f700: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
f710: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
f720: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
f730: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
f740: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
f750: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
f760: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
f770: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
f780: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
f790: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
f7a0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
f7b0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
f7c0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
f7d0: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
f7e0: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
f7f0: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
f800: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
f810: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
f820: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
f830: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
f840: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
f850: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
f860: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
f870: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
f880: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
f890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
f8a0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
f8b0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
f8c0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
f8d0: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
f8e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f8f0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
f900: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
f910: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f920: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
f930: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
f940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
f950: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
f960: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
f970: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
f980: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
f990: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
f9a0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
f9b0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
f9c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
f9d0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
f9e0: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
f9f0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
fa00: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
fa10: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
fa20: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
fa30: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
fa40: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
fa50: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
fa60: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
fa70: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
fa80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
fa90: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
faa0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
fab0: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
fac0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fad0: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
fae0: 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
faf0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
fb00: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
fb10: 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
fb20: 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
fb30: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
fb40: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
fb50: 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
fb60: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
fb70: 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
fb80: 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
fb90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fba0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
fbb0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
fbc0: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
fbd0: 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
fbe0: 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
fbf0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
fc00: 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
fc10: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
fc20: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
fc30: 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
fc40: 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
fc50: 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
fc60: 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
fc70: 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
fc80: 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
fc90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
fca0: 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
fcb0: 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
fcc0: 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
fcd0: 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
fce0: 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
fcf0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
fd00: 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
fd10: 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
fd20: 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
fd30: 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
fd40: 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
fd50: 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
fd60: 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
fd70: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
fd80: 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
fd90: 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
fda0: 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
fdb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
fdc0: 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
fdd0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
fde0: 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
fdf0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
fe00: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
fe10: 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
fe20: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
fe30: 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
fe40: 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
fe50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fe60: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
fe70: 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
fe80: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
fe90: 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
fea0: 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
feb0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
fec0: 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
fed0: 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
fee0: 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
fef0: 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
ff00: 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
ff10: 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
ff20: 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
ff30: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
ff40: 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
ff50: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
ff60: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
ff70: 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
ff80: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ff90: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
ffa0: 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
ffb0: 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
ffc0: 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
ffd0: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
ffe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fff0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
10000 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
10010 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
10020 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
10030 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
10040 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
10050 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
10060 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
10070 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
10080 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
10090 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
100a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
100b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
100c0 6b 3b 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  k;.#if !OS_VXWOR
100d0 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  KS.    /* Always
100e0 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
100f0 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10100 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74 69   file */.    uti
10110 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
10120 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
10130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10140 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
10150 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
10160 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64 20 3d 20   lock */.  fd = 
10170 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4c 6f 63  robust_open(zLoc
10180 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f  kFile,O_RDONLY|O
10190 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36  _CREAT|O_EXCL,06
101a0 30 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  00);.  if( fd<0 
101b0 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
101c0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
101d0 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e  the file, someon
101e0 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20  e else may have 
101f0 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20  stolen the lock 
10200 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  */.    int tErrn
10210 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
10220 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72  f( EEXIST == tEr
10230 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
10240 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10250 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
10260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10270 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10280 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10290 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
102a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
102b0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
102c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
102d0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
102e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
102f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
10300 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
10310 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
10320 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f  E__);.  .  /* go
10330 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10340 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10350 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69   */.  pFile->eFi
10360 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10370 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
10380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
10390 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
103a0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
103b0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
103c0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
103d0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
103e0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
103f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
10400 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
10410 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
10420 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10430 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
10440 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
10450 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
10460 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
10470 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
10480 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c  **.** When the l
10490 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61  ocking level rea
104a0 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65  ches NO_LOCK, de
104b0 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
104c0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
104d0 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  t dotlockUnlock(
104e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
104f0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
10500 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10510 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10520 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c  *)id;.  char *zL
10530 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
10540 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
10550 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
10560 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
10570 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
10580 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
10590 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
105a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
105b0 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70 46 69 6c  leLock,..   pFil
105c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
105d0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
105e0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
105f0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10600 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
10610 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
10620 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
10630 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
10640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10650 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
10660 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  To downgrade to 
10670 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75  shared, simply u
10680 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
10690 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65  al notion of the
106a0 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  .  ** lock state
106b0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65  .  No need to me
106c0 73 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ss with the file
106d0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
106e0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
106f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10700 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10710 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10720 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
10730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10740 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e    /* To fully un
10750 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10760 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  e, delete the lo
10770 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73  ck file */.  ass
10780 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
10790 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  NO_LOCK );.  if(
107a0 20 75 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c   unlink(zLockFil
107b0 65 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  e) ){.    int rc
107c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 45   = 0;.    int tE
107d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
107e0 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20    if( ENOENT != 
107f0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
10800 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10810 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10820 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10830 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
10840 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
10850 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10860 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10870 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
10880 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
10890 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
108a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
108b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
108c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
108d0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
108e0 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
108f0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
10900 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
10910 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
10920 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10930 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10940 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
10950 63 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  c;.  if( id ){. 
10960 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
10970 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10980 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55  id;.    dotlockU
10990 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
109a0 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  K);.    sqlite3_
109b0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
109c0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
109d0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
109e0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 72 65 74  xFile(id);.  ret
109f0 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10a10 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
10a20 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
10a30 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b00 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
10b10 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
10b40 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
10b50 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
10b60 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
10b70 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
10b80 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
10b90 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
10ba0 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
10bb0 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
10bc0 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
10bd0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
10be0 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
10bf0 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
10c00 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
10c10 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
10c20 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
10c30 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
10c40 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
10c50 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
10c60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
10c70 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
10c80 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
10c90 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
10ca0 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
10cb0 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
10cc0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
10cd0 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
10ce0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
10cf0 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
10d00 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
10d10 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
10d20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10d30 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
10d40 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d  off or if.** com
10d50 70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52  piling for VXWOR
10d60 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  KS..*/.#if SQLIT
10d70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
10d80 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
10d90 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  WORKS../*.** Ret
10da0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
10db0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
10dc0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
10dd0 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
10de0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
10df0 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
10e00 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
10e10 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
10e20 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
10e30 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
10e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10e50 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
10e60 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
10e70 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
10e80 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
10e90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
10ea0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
10eb0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10ec0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
10ed0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
10ee0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
10ef0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
10f00 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
10f10 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
10f20 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
10f30 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
10f40 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
10f50 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
10f60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
10f70 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
10f80 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
10f90 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
10fa0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
10fb0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
10fc0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
10fd0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
10fe0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
10ff0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
11000 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11010 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11020 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11030 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11040 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
11050 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11070 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11080 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11090 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
110a0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
110b0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
110c0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
110d0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
110e0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
110f0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
11100 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
11110 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
11120 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
11130 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
11140 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
11150 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
11160 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
11170 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
11180 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
11190 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
111a0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
111b0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
111c0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
111d0 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
111e0 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
111f0 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
11200 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
11210 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
11220 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
11230 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
11240 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
11250 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
11260 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
11270 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
11280 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
11290 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
112a0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
112b0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
112c0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
112d0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
112e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
112f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11300 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11310 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11330 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11340 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11350 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11360 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11370 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
11380 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
11390 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
113a0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
113b0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
113c0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
113d0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
113e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
113f0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
11400 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11410 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11420 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11440 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11450 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11460 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11470 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
11480 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
11490 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
114a0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
114b0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
114c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
114d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
114e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
114f0 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
11500 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11510 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11520 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11530 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11540 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11560 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11570 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11580 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11590 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
115a0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
115b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
115c0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
115d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
115e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
115f0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
11600 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11610 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11620 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11630 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11640 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11650 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11660 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11670 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11680 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11690 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
116a0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
116b0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
116c0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
116d0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
116e0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
116f0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
11700 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11710 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11720 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11730 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11740 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11750 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11760 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11770 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11780 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11790 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
117a0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
117b0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
117c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
117d0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
117e0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
117f0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11800 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11810 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11820 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11830 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11840 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11850 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11860 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11870 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11880 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11890 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
118a0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
118b0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
118c0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
118d0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
118e0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
118f0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11910 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11920 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11930 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11940 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11950 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11960 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11970 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11980 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11990 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
119a0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
119b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
119c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
119d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
119e0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
119f0 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11a00 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11a10 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11a20 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11a30 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11a40 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11a50 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11a60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11a70 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11a80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11a90 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11ab0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11ac0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11ad0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
11ae0 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
11af0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11b00 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
11b10 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11b20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
11b30 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
11b40 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
11b50 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11b60 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11b70 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11b80 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
11b90 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11ba0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
11bb0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11bc0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
11bd0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
11be0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
11bf0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
11c00 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
11c10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11c20 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
11c30 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
11c40 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
11c50 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
11c60 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
11c70 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
11c80 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
11c90 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
11ca0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
11cb0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
11cc0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
11cd0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
11ce0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
11cf0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
11d00 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
11d10 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11d20 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11d30 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
11d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11d50 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
11d60 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11d70 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11d80 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11d90 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11da0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11db0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11dc0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11dd0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11de0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11e00 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
11e10 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11e20 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
11e30 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
11e40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
11e50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
11e60 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
11e70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11e80 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11e90 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11ea0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11eb0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11ec0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
11ed0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
11ee0 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
11ef0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11f00 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
11f10 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11f20 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
11f30 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
11f40 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
11f50 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
11f60 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
11f70 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
11f80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
11f90 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
11fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11fb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
11fc0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
11fd0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
11fe0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
11ff0 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12000 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12010 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12030 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12050 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12060 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12070 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ck. */.  int rc 
12080 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
12090 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
120a0 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b 0a 20  );.  if (rc) {. 
120b0 20 20 20 69 6e 74 20 72 2c 20 74 45 72 72 6e 6f     int r, tErrno
120c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 20   = errno;.    r 
120d0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
120e0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
120f0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12100 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
12110 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12120 72 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  r) ){.      pFil
12130 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
12140 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 23 69 66  Errno;.    }.#if
12150 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
12160 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12170 4f 52 53 0a 20 20 20 20 69 66 28 20 28 72 20 26  ORS.    if( (r &
12180 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
12190 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
121a0 7b 0a 20 20 20 20 20 20 72 20 3d 20 53 51 4c 49  {.      r = SQLI
121b0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 23  TE_BUSY;.    }.#
121c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
121d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
121e0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
121f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 3b 0a 20  .    return r;. 
12200 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46   } else {.    pF
12210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12220 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
12230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
12250 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
12260 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
12270 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12280 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
12290 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c   ){.    flockUnl
122a0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
122b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
122c0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
122d0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
122e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
122f0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
12300 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
12330 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
12340 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
12420 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
12430 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
12440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
12450 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
12460 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
12470 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
12480 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
12490 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
124a0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
124b0 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
124c0 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
124d0 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
124e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
124f0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
12500 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
12510 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
12520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12530 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
12540 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
12550 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
12560 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
12570 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
12580 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
12590 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
125a0 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
125b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
125c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
125d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
125e0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
125f0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
12600 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
12610 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
12620 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
12630 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
12640 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
12650 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
12660 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
12670 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
12680 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
12690 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
126a0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
126b0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
126c0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
126d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
126e0 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
126f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12700 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
12710 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
12720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12730 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12740 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12750 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12760 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
12770 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
12780 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12790 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
127a0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
127b0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
127c0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
127d0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
127e0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
127f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12800 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
12810 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
12820 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
12830 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
12840 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
12850 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
12860 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
12870 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
12880 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
12890 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
128a0 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  m;.    struct st
128b0 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20 20  at statBuf;..   
128c0 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
128d0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
128e0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
128f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
12900 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
12910 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
12920 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12930 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12940 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12950 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12960 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 46  OCK);.        pF
12970 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12980 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
12990 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
129a0 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
129b0 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
129c0 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
129d0 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
129e0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
129f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
12a00 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
12a10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
12a20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
12a30 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
12a40 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
12a50 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
12a60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
12a70 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
12a80 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
12a90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12aa0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12ab0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12ac0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12ae0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12af0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12b00 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12b10 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
12b20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
12b30 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
12b40 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
12b50 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
12b60 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
12b70 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
12b80 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
12b90 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
12ba0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
12bb0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
12bc0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
12bd0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
12be0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
12bf0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
12c00 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
12c10 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
12c20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
12c30 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
12c40 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
12c50 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
12c60 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
12c70 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
12c80 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
12c90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
12ca0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
12cb0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
12cc0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
12cd0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
12ce0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
12cf0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
12d00 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
12d10 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
12d20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12d30 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12d40 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
12d50 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
12d60 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12d70 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
12d80 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
12d90 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
12da0 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
12db0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
12dc0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
12dd0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
12de0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
12df0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
12e00 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
12e10 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
12e20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
12e30 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
12e40 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
12e50 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
12e60 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
12e70 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
12e80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12e90 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
12ea0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
12eb0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
12ec0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
12ed0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
12ee0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
12ef0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c  .static int semL
12f00 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12f10 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
12f20 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
12f30 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
12f40 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
12f50 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  fd;.  sem_t *pSe
12f60 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
12f70 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72  e->pSem;.  int r
12f80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12f90 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
12fa0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
12fb0 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
12fc0 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
12fd0 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
12fe0 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
12ff0 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
13000 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
13010 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
13020 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13030 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
13040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13050 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
13060 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
13070 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
13080 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
13090 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
130a0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
130b0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
130c0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
130d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
130e0 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
130f0 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
13100 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
13110 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
13120 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
13130 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13140 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  Lock;.. sem_end_
13150 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
13160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
13170 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
13180 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
13190 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
131a0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
131b0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
131c0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
131d0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
131e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
131f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13200 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13210 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
13220 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
13230 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
13240 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
13250 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13270 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  semUnlock(sqlite
13280 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13290 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
132a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
132b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
132c0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
132d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
132e0 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
132f0 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
13300 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
13310 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13320 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13330 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
13340 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
13350 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ,..   pFile->eFi
13360 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
13370 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
13380 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
13390 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
133a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
133b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
133c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
133d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
133e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
133f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
13400 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
13410 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
13420 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
13430 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
13440 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
13450 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
13460 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13470 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
13480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13490 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
134a0 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
134b0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
134c0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
134d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
134e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
134f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13500 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13510 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13520 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
13530 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13540 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13550 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13560 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
13570 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
13580 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  ; .  }.  pFile->
13590 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
135a0 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OCK;.  return SQ
135b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20  LITE_OK;.}../*. 
135c0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
135d0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
135e0 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  semClose(sqlite3
135f0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
13600 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
13610 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13620 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
13630 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20    semUnlock(id, 
13640 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
13650 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13660 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
13670 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
13680 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
13690 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
136a0 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
136b0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
136c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
136d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
136e0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
136f0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
13700 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
13710 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
13720 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
13730 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13740 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
13750 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
13760 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
137d0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
13840 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
13850 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
13860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13870 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
13880 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
13890 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
138a0 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
138b0 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
138c0 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
138d0 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
138e0 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
138f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
13900 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
13910 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
13920 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
13930 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
13940 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
13950 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
13960 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
13970 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
13980 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
13990 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
139a0 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
139b0 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
139c0 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
139d0 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
139e0 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
139f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
13a00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
13a10 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
13a20 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
13a30 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
13a40 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a60 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
13a70 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
13a80 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
13a90 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
13aa0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
13ab0 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
13ac0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
13ad0 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
13ae0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
13af0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
13b00 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
13b10 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
13b20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
13b30 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
13b40 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
13b50 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
13b60 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
13b70 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
13b80 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
13b90 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
13ba0 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
13bb0 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
13bc0 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
13bd0 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
13be0 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
13bf0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
13c00 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c20 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
13c30 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
13c40 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
13c50 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
13c60 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
13c70 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
13c80 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
13c90 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
13ca0 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
13cb0 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
13cc0 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
13cd0 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
13ce0 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
13cf0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
13d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
13d10 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
13d20 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
13d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
13d40 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
13d50 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
13d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13d70 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13d80 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
13d90 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
13da0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13dc0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
13dd0 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
13de0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13df0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
13e00 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
13e10 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
13e20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
13e30 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
13e40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
13e50 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
13e60 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e80 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
13e90 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
13ea0 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
13eb0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
13ec0 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
13ed0 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
13ee0 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
13ef0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
13f00 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
13f10 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
13f20 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
13f30 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
13f40 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
13f50 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
13f60 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
13f70 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
13f80 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
13f90 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
13fa0 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
13fb0 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
13fc0 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
13fd0 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
13fe0 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
13ff0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
14000 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
14010 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
14020 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
14030 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
14040 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14050 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
14060 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
14070 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
14080 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
14090 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
140a0 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
140b0 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
140c0 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
140d0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
140e0 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
140f0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
14100 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
14110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
14120 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
14130 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
14150 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
14160 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
14170 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14180 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
14190 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
141a0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
141b0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
141c0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
141d0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
141e0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
141f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
14200 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
14210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14220 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
14230 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14240 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14250 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14260 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14270 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14280 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14290 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
142a0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
142b0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
142c0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
142d0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
142e0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
142f0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14300 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14310 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14320 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14330 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14340 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
14350 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
14360 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
14370 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14380 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14390 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
143a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
143b0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
143c0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
143d0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
143e0 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
143f0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
14400 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14410 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
14420 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
14430 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
14440 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14450 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
14460 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
14470 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
14480 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
14490 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
144a0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
144b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
144c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
144d0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
144e0 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
144f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
14500 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
14510 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a  reads */.  .  /*
14520 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
14530 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
14540 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
14550 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
14560 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
14570 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
14580 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
14590 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
145a0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
145b0 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
145c0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
145d0 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72  ..   */.  if( !r
145e0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
145f0 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52  * lock the RESER
14600 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  VED byte */.    
14610 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74  int lrc = afpSet
14620 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
14630 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
14640 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
14650 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ;  .    if( SQLI
14660 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20  TE_OK==lrc ){.  
14670 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63      /* if we suc
14680 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67  ceeded in taking
14690 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
146a0 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f  ck, unlock it to
146b0 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a   restore.      *
146c0 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  * the original s
146d0 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72  tate */.      lr
146e0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
146f0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
14700 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
14710 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
14720 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
14730 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20  /* if we failed 
14740 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
14750 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  then someone els
14760 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a  e must have it *
14770 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  /.      reserved
14780 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
14790 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
147a0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
147b0 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20  rc=lrc;.    }.  
147c0 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
147d0 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
147e0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
147f0 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29  K %d %d %d (afp)
14800 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14810 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
14820 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72   .  *pResOut = r
14830 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14840 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
14850 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
14860 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
14870 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
14880 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
14890 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
148a0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
148b0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
148c0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
148d0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
148e0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
148f0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14900 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14910 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14920 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14930 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14940 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
14950 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
14960 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
14970 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
14980 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
14990 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
149a0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
149b0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
149c0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
149d0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
149e0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
149f0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14a00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14a10 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14a20 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14a30 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14a40 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14a50 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
14a60 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
14a70 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
14a80 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
14a90 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
14aa0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14ab0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14ac0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14ad0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14ae0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14af0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14b00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
14b10 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
14b20 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
14b30 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
14b40 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
14b50 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
14b60 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
14b70 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28  tic int afpLock(
14b80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14b90 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14ba0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14bb0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
14bc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14bd0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
14be0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
14bf0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
14c00 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
14c10 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
14c20 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
14c30 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
14c40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14c50 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14c60 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
14c70 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
14c80 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
14c90 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
14ca0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
14cb0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
14cc0 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
14cd0 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
14ce0 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  leLock),.       
14cf0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
14d00 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
14d10 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  ), pInode->nShar
14d20 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ed , getpid()));
14d30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
14d40 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
14d50 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
14d60 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
14d70 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
14d80 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
14d90 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
14da0 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
14db0 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
14dc0 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
14dd0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
14de0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
14df0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14e00 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
14e10 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
14e20 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
14e30 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
14e40 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70  eld) (afp)\n", p
14e50 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
14e60 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
14e70 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
14e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14e90 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
14ea0 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
14eb0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
14ec0 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29  orrect.  **  (1)
14ed0 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66   We never move f
14ee0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20  rom unlocked to 
14ef0 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20  anything higher 
14f00 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b  than shared lock
14f10 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69  ..  **  (2) SQLi
14f20 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69  te never explici
14f30 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70  tly requests a p
14f40 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  endig lock..  **
14f50 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c    (3) A shared l
14f60 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65  ock is always he
14f70 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76  ld when a reserv
14f80 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e lock is reques
14f90 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
14fa0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
14fb0 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
14fc0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
14fd0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
14fe0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
14ff0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
15000 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15010 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock!=RESERVED_LO
15020 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69  CK || pFile->eFi
15030 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15040 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
15050 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
15060 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
15070 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
15080 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
15090 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  ds.  */.  unixEn
150a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
150b0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
150c0 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73  node;..  /* If s
150d0 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
150e0 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20   this PID has a 
150f0 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65  lock via a diffe
15100 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20  rent unixFile*. 
15110 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
15120 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
15130 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
15140 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
15150 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46    if( (pFile->eF
15160 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d  ileLock!=pInode-
15170 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20  >eFileLock && . 
15180 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
15190 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
151a0 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
151b0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
151c0 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63  ).     ){.    rc
151d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
151e0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
151f0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
15200 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
15210 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
15220 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
15230 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
15240 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
15250 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
15260 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
15270 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
15280 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
15290 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
152a0 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
152b0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
152c0 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
152d0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
152e0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
152f0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
15300 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
15310 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
15320 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
15330 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
15340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
15350 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
15360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15370 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
15380 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
15390 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
153a0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
153b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
153c0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
153d0 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66  k++;.    goto af
153e0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  p_end_lock;.  }.
153f0 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
15400 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
15410 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
15420 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
15430 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a  k and before.  *
15440 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
15450 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
15460 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
15470 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
15480 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
15490 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  leased..  */.  i
154a0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
154b0 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
154c0 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
154d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
154e0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
154f0 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
15500 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61  .  ){.    int fa
15510 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64  iled;.    failed
15520 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15530 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15540 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
15550 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  TE, 1, 1);.    i
15560 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20  f (failed) {.   
15570 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
15580 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15590 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
155a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
155b0 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
155c0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
155d0 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
155e0 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
155f0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
15600 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
15610 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
15620 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
15630 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
15640 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c  ){.    int lrc1,
15650 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f   lrc2, lrc1Errno
15660 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d  ;.    long lk, m
15670 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73  ask;.    .    as
15680 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
15690 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
156a0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
156b0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
156c0 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73          .    mas
156d0 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67  k = (sizeof(long
156e0 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f  )==8) ? LARGEST_
156f0 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66  INT64 : 0x7fffff
15700 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  ff;.    /* Now g
15710 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
15720 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
15730 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74      /* note that
15740 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
15750 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64  the randomness d
15760 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68  oesn't matter th
15770 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c  at much */.    l
15780 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20  k = random(); . 
15790 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65     pInode->share
157a0 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61  dByte = (lk & ma
157b0 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  sk)%(SHARED_SIZE
157c0 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20   - 1);.    lrc1 
157d0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
157e0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
157f0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
15800 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
15810 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
15820 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
15830 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15840 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63  c1) ){.      lrc
15850 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e  1Errno = pFile->
15860 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d  lastErrno;.    }
15870 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
15880 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
15890 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
158a0 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  rc2 = afpSetLock
158b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
158c0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
158d0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
158e0 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f    .    if( IS_LO
158f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
15900 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
15910 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 72 63 31  lastErrno = lrc1
15920 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
15930 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
15940 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
15950 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
15960 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15970 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
15980 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
15990 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
159a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
159b0 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
159c0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
159d0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
159e0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
159f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
15a00 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
15a10 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
15a20 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
15a30 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
15a40 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
15a50 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
15a60 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
15a70 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
15a80 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
15a90 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
15aa0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
15ab0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
15ac0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
15ad0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
15ae0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
15af0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
15b00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15b10 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
15b20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
15b30 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
15b40 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
15b50 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
15b60 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
15b70 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
15b80 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
15b90 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
15ba0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
15bb0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
15bc0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
15bd0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
15be0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
15bf0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
15c00 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
15c10 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
15c20 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
15c30 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
15c40 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
15c50 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
15c60 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
15c70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15c80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15c90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15ca0 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
15cb0 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
15cc0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
15cd0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
15ce0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
15cf0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
15d00 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
15d10 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
15d20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
15d30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
15d40 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
15d50 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
15d60 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
15d70 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
15d80 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
15d90 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
15da0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
15db0 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
15dc0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
15dd0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
15de0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
15df0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
15e00 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
15e10 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
15e20 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15e40 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
15e50 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
15e60 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
15e70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15e80 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
15e90 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
15ea0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15eb0 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
15ec0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
15ed0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15ee0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
15ef0 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
15f20 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
15f30 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
15f40 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
15f50 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15f60 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f80 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15f90 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
15fa0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15fb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
15fc0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
15fd0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
15fe0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
15ff0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
16000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
16010 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
16020 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
16030 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
16040 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
16050 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
16060 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
16070 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
16080 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
16090 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
160a0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
160b0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
160c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
160d0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
160e0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
160f0 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
16100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
16110 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
16120 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
16130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
16140 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16150 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
16160 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16170 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16180 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
16190 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
161a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
161b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
161c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
161d0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
161e0 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
161f0 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
16200 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
16210 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
16220 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
16230 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e  %d %s %s (afp)\n
16240 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
16250 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16260 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  k), .         rc
16270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
16280 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
16290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
162a0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
162b0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
162c0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
162d0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
162e0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
162f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
16300 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
16310 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
16320 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
16330 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
16340 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
16350 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
16360 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
16370 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
16380 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
16390 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
163a0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
163b0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
163c0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
163d0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
163e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
163f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16400 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16410 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
16420 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c   *pInode;.  afpL
16430 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
16440 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
16450 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
16460 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
16470 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70  text;.  int skip
16480 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  Shared = 0;.#ifd
16490 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
164a0 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e   int h = pFile->
164b0 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  h;.#endif..  ass
164c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
164d0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
164e0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
164f0 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  d,%d) pid=%d (af
16500 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16510 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
16520 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
16530 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
16540 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16550 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
16560 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
16570 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
16580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
16590 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
165a0 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
165b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
165c0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
165d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
165e0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
165f0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
16600 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
16610 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
16620 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
16630 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
16640 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
16650 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
16660 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
16670 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
16680 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
16690 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
166a0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
166b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
166c0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
166d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
166e0 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e  gn(0);.    .#ifn
166f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
16700 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
16710 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
16720 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
16730 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
16740 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
16750 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
16760 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
16770 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
16780 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
16790 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
167a0 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
167b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
167c0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
167d0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
167e0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
167f0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
16800 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
16810 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
16820 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
16830 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
16840 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
16850 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
16860 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
16870 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
16880 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
16890 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
168a0 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
168b0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
168c0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
168d0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
168e0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
168f0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
16900 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
16910 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
16920 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
16930 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
16940 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
16950 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
16960 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
16970 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
16980 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
16990 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
169a0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
169b0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
169c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
169d0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
169e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
169f0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
16a00 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16a10 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
16a20 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
16a30 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
16a40 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
16a50 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
16a60 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
16a70 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
16a80 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
16a90 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
16aa0 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
16ab0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16ac0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16ad0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
16ae0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
16af0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
16b00 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
16b10 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16b20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
16b30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
16b40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
16b50 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
16b60 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
16b70 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16b80 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16b90 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16ba0 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
16bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16bc0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16bd0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
16be0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
16bf0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
16c00 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16c10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16c20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16c30 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16c40 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
16c50 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
16c60 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
16c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16c90 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
16ca0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
16cb0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16cc0 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
16cd0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
16ce0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16cf0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
16d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
16d10 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
16d20 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
16d30 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
16d40 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
16d50 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
16d60 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
16d70 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
16d80 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
16d90 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
16da0 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
16db0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
16dc0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
16dd0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
16de0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
16df0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
16e00 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16e10 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
16e20 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
16e30 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
16e40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
16e50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16e60 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
16e70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
16e80 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
16e90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
16ea0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
16eb0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
16ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
16ed0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16ee0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16ef0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
16f00 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
16f10 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
16f20 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
16f30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
16f40 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
16f50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16f60 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
16f70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16f90 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
16fa0 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
16fb0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
16fc0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
16fd0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
16fe0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
16ff0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
17000 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
17010 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
17020 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17030 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17040 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
17050 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17060 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
17070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
17080 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
17090 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
170a0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
170b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
170c0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
170d0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
170e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
170f0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
17100 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17110 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17120 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28  ;.    afpUnlock(
17130 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
17140 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17150 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  ();.    if( pFil
17160 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69  e->pInode && pFi
17170 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
17180 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  k ){.      /* If
17190 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
171a0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
171b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
171c0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
171d0 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62  t.      ** yet b
171e0 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
171f0 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
17200 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
17210 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
17220 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
17230 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
17240 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
17250 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
17260 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20  losed when.     
17270 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
17280 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
17290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
172a0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
172b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
172c0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
172d0 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
172e0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
172f0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
17300 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
17310 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e  File(id);.    un
17320 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
17330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17340 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
17350 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
17360 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
17370 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
17380 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
17390 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
173a0 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
173b0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
173c0 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
173d0 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
173e0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
173f0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
17400 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
17410 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
17420 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
17430 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
17440 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
17450 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
17460 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
17470 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
17480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17490 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
174a0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
174b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
174c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
174d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
174f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17510 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
17520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17560 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
17590 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
175a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
175c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
175d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
175e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
175f0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
17600 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17610 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
17620 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
17630 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
17640 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
17650 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
17660 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
17670 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
17680 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
17690 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
176a0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
176b0 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
176c0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
176d0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
176e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
176f0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
17700 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
17710 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17720 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
17730 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
17740 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
17750 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
17760 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
17770 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
17780 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
17790 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
177a0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
177b0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
177c0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
177d0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
177e0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
177f0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17800 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17810 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17820 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17830 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
17840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17850 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
17860 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
17870 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
178e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
178f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
17950 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
17960 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
17970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17980 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
17990 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
179a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
179b0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
179c0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
179d0 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
179e0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
179f0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
17a00 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
17a10 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
17a20 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
17a30 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
17a40 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
17a50 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
17a60 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
17a70 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
17a80 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
17a90 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
17aa0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
17ab0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
17ac0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
17ad0 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
17ae0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
17af0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
17b00 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
17b10 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
17b20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17b30 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17b40 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17b50 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17b60 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
17b70 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
17b80 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
17b90 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
17ba0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
17bb0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
17bc0 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
17bd0 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
17be0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
17bf0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
17c00 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
17c10 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
17c20 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
17c30 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
17c40 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17c50 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17c60 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
17c70 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
17c80 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
17c90 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
17ca0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
17cb0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
17cc0 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
17cd0 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
17ce0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17cf0 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
17d00 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
17d10 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17d20 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
17d30 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
17d40 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17d50 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17d60 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
17d70 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
17d80 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
17d90 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
17da0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
17db0 45 41 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d  EAD).  do{ got =
17dc0 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
17dd0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
17de0 74 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c  t); }while( got<
17df0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
17e00 52 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  R );.  SimulateI
17e10 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
17e20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
17e30 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
17e40 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65   do{ got = osPre
17e50 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
17e60 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20  , cnt, offset); 
17e70 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
17e80 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
17e90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17ea0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
17eb0 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
17ec0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
17ed0 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
17ee0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17ef0 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
17f00 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
17f10 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
17f20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
17f30 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
17f40 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
17f50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
17f60 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
17f70 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
17f80 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
17f90 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
17fa0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
17fb0 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73  }.  do{ got = os
17fc0 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
17fd0 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65 28 20  , cnt); }while( 
17fe0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
17ff0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
18000 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 69    TIMER_END;.  i
18010 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
18020 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18030 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
18040 6e 6f 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  no;.  }.  OSTRAC
18050 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
18060 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
18070 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20  n", id->h, got, 
18080 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
18090 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
180a0 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n got;.}../*.** 
180b0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
180c0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
180d0 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
180e0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
180f0 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
18100 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
18110 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
18120 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18130 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
18140 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
18150 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18160 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
18170 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
18180 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18190 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
181a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
181b0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
181c0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
181d0 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
181e0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
181f0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
18200 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
18210 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
18220 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
18230 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
18240 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
18250 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
18260 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
18270 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
18280 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
18290 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
182a0 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
182b0 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
182c0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
182d0 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
182e0 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
182f0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
18300 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
18310 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
18320 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
18330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18340 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
18350 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
18360 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
18370 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
18380 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18390 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
183a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
183b0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
183c0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
183d0 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
183e0 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
183f0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
18400 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
18410 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
18420 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
18430 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
18440 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
18450 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
18460 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  }.}../*.** Seek 
18470 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
18480 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
18490 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
184a0 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
184b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
184c0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
184d0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
184e0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
184f0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
18500 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
18510 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
18520 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
18530 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
18540 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
18550 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
18560 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
18570 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
18580 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
18590 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
185a0 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
185b0 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
185c0 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
185d0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
185e0 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
185f0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
18600 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20  IMER_START;.#if 
18610 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18620 44 29 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f  D).  do{ got = o
18630 73 50 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70  sPwrite(id->h, p
18640 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18650 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30  ); }while( got<0
18660 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
18670 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
18680 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
18690 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72   do{ got = osPwr
186a0 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ite64(id->h, pBu
186b0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
186c0 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
186d0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
186e0 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65  #else.  newOffse
186f0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
18700 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
18710 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  T);.  SimulateIO
18720 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
18730 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f  -- );.  if( newO
18740 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
18750 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
18760 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
18770 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18780 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18790 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rrno;.    }else{
187a0 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
187b0 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
187c0 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a  o = 0;....    }.
187d0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
187e0 20 7d 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f   }.  do{ got = o
187f0 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
18800 75 66 2c 20 63 6e 74 29 3b 20 7d 77 68 69 6c 65  uf, cnt); }while
18810 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
18820 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
18830 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  f.  TIMER_END;. 
18840 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18850 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
18860 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
18870 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rrno;.  }..  OST
18880 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25  RACE(("WRITE   %
18890 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
188a0 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f  lu\n", id->h, go
188b0 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52  t, offset, TIMER
188c0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65  _ELAPSED));.  re
188d0 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
188e0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
188f0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
18900 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
18910 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18920 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
18930 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
18940 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
18950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
18960 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
18970 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
18980 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
18990 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
189a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
189b0 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
189c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
189d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
189e0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
189f0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
18a00 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
18a10 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18a20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18a30 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
18a40 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
18a50 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
18a60 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
18a70 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
18a80 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
18a90 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
18aa0 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
18ab0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
18ac0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
18ad0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
18ae0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
18af0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
18b00 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
18b10 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   );.#endif..#ifn
18b20 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
18b30 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
18b40 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
18b50 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
18b60 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
18b70 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f  .  ** doing a ho
18b80 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
18b90 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
18ba0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
18bb0 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72   than a.  ** nor
18bc0 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
18bd0 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74  e) then record t
18be0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
18bf0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68   database.  ** h
18c00 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  as changed.  If 
18c10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18c20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66  counter is modif
18c30 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74  ied, record that
18c40 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a  .  ** fact too..
18c50 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
18c60 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
18c70 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  ){.    pFile->db
18c80 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20  Update = 1;  /* 
18c90 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  The database has
18ca0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a   been modified *
18cb0 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  /.    if( offset
18cc0 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61  <=24 && offset+a
18cd0 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20  mt>=27 ){.      
18ce0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
18cf0 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20  ar oldCntr[4];. 
18d00 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18d10 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18d20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e       rc = seekAn
18d30 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c  dRead(pFile, 24,
18d40 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20   oldCntr, 4);.  
18d50 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18d60 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
18d70 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c      if( rc!=4 ||
18d80 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c   memcmp(oldCntr,
18d90 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b   &((char*)pBuf)[
18da0 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d  24-offset], 4)!=
18db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
18dc0 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
18dd0 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74  g = 1;  /* The t
18de0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
18df0 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a  er has changed *
18e00 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
18e10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
18e20 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
18e30 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
18e40 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
18e50 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30  t, pBuf, amt))>0
18e60 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
18e70 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
18e80 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
18e90 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
18ea0 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
18eb0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
18ec0 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
18ed0 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
18ee0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
18ef0 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
18f00 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
18f10 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  mt>0 ){.    if( 
18f20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  wrote<0 ){.     
18f30 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
18f40 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
18f50 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
18f60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
18f70 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
18f80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
18f90 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20  stErrno = 0; /* 
18fa0 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
18fb0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  or */.      retu
18fc0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
18fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
18fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18ff0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19000 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
19010 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
19020 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
19030 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
19040 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
19050 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
19060 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
19070 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
19080 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
19090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
190a0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
190b0 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
190c0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
190d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
190e0 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
190f0 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
19100 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
19110 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
19120 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
19130 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
19140 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
19150 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20 66 73   the (slower) fs
19160 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79 6f 75  ync()..** If you
19170 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
19180 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
19190 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
191a0 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
191b0 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
191c0 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
191d0 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a  nc=fdatasync.*/.
191e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61  #if !defined(fda
191f0 74 61 73 79 6e 63 29 20 26 26 20 21 64 65 66 69  tasync) && !defi
19200 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23  ned(__linux__).#
19210 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
19220 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
19230 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
19240 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
19250 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
19260 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
19270 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
19280 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
19290 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
192a0 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
192b0 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
192c0 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
192d0 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
192e0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
192f0 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
19300 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
19310 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
19320 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
19330 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
19340 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
19350 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
19360 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
19370 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
19380 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
19390 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
193a0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
193b0 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
193c0 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
193d0 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
193e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
193f0 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
19400 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
19410 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
19420 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
19430 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
19440 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
19450 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
19460 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
19470 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
19480 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
19490 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
194a0 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
194b0 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
194c0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
194d0 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
194e0 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
194f0 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
19500 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
19510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
19520 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
19530 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
19540 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
19550 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
19560 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
19570 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
19580 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
19590 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
195a0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
195b0 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
195c0 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
195d0 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
195e0 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
195f0 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
19600 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
19610 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
19620 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
19630 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
19640 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
19650 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19660 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
19670 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
19680 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
19690 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
196a0 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
196b0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
196c0 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
196d0 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
196e0 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
196f0 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
19700 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
19710 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
19720 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
19730 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
19740 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
19750 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
19760 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
19770 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
19780 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
19790 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
197a0 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
197b0 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
197c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
197d0 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
197e0 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
197f0 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
19800 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
19810 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
19820 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
19830 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
19840 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
19850 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
19860 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
19870 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
19880 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
19890 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
198a0 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
198b0 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
198c0 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
198d0 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
198e0 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
198f0 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
19900 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
19910 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
19920 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
19930 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
19940 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
19950 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
19960 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
19970 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19980 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
19990 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
199a0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
199b0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
199c0 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
199d0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
199e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
199f0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
19a00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19a10 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19a20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19a30 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
19a40 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
19a50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
19a60 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
19a70 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
19a80 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
19a90 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
19aa0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
19ab0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
19ac0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
19ad0 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
19ae0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
19af0 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
19b00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19b10 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
19b20 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
19b30 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
19b40 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19b50 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
19b60 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
19b70 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
19b80 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
19b90 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
19ba0 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
19bb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
19bc0 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
19bd0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
19be0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
19bf0 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
19c00 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
19c10 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
19c20 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
19c30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
19c40 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
19c50 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
19c60 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
19c70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
19c80 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
19c90 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
19ca0 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
19cb0 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
19cc0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
19cd0 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
19ce0 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
19cf0 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
19d00 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
19d10 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
19d20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
19d30 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
19d40 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
19d50 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
19d60 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
19d70 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
19d80 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
19d90 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
19da0 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
19db0 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
19dc0 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
19dd0 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
19de0 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
19df0 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
19e00 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
19e10 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
19e20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
19e30 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
19e40 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
19e50 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
19e60 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
19e70 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
19e80 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
19e90 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
19ea0 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
19eb0 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
19ec0 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
19ed0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
19ee0 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
19ef0 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
19f00 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
19f10 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
19f20 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
19f30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
19f40 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
19f50 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
19f60 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
19f70 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
19f80 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
19f90 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
19fa0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
19fb0 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
19fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
19fd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19fe0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
19ff0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1a000 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1a010 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1a020 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1a030 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1a040 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1a050 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1a060 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1a070 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1a080 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1a090 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1a0a0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1a0b0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1a0c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1a0d0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1a0e0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1a0f0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1a100 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1a110 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1a120 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1a130 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1a140 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1a150 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1a160 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1a170 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1a180 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1a190 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1a1a0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1a1b0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1a1c0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1a1d0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1a1e0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1a1f0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1a200 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1a210 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1a220 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1a230 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1a240 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1a250 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1a260 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1a270 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1a280 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1a290 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1a2a0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1a2b0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1a2c0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1a2d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a2e0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1a2f0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1a300 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1a310 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1a320 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1a330 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1a340 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1a350 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1a360 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1a370 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1a380 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1a390 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1a3a0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1a3b0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1a3c0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1a3d0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1a3e0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1a3f0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1a400 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1a410 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1a420 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1a430 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1a440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1a450 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1a460 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1a470 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1a480 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1a490 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1a4a0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1a4b0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1a4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1a4d0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1a4e0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1a4f0 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1a500 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1a510 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1a520 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1a530 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1a540 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1a550 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1a560 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1a570 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1a580 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a590 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1a5a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1a5b0 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1a5c0 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1a5d0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Path);.  }.  if(
1a5e0 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30   pFile->dirfd>=0
1a5f0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1a600 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28  ("DIRSYNC %-3d (
1a610 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1a620 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1a630 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
1a640 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1a650 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1a660 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69 66 6e 64  ullsync));.#ifnd
1a670 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
1a680 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
1a690 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
1a6a0 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
1a6b0 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
1a6c0 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
1a6d0 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
1a6e0 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
1a6f0 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
1a700 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
1a710 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
1a720 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
1a730 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
1a740 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
1a750 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69 73 46  ULLFSYNC || !isF
1a760 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75 6c 6c  ullsync) && full
1a770 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69  _fsync(pFile->di
1a780 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  rfd,0,0) ){.    
1a790 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20     /*.       ** 
1a7a0 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64  We have received
1a7b0 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74   multiple report
1a7c0 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74  s of fsync() ret
1a7d0 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a  urning.       **
1a7e0 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70   errors when app
1a7f0 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72  lied to director
1a800 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66  ies on certain f
1a810 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ile systems..   
1a820 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20      ** A failed 
1a830 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
1a840 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c  s not a big deal
1a850 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20  .  So it seems. 
1a860 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20        ** better 
1a870 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72  to ignore the er
1a880 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ror.  Ticket #16
1a890 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  57.       */.   
1a8a0 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 6c 61      /* pFile->la
1a8b0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1a8c0 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65   */.       /* re
1a8d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a8e0 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  R; */.    }.#end
1a8f0 69 66 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6e  if.    /* Only n
1a900 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
1a910 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 20  , so close the  
1a920 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20 77  directory when w
1a930 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20 20  e are done */.  
1a940 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1a950 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 64 69 72  File, pFile->dir
1a960 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1a970 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20     pFile->dirfd 
1a980 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1a990 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a9a0 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1a9b0 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1a9c0 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1a9d0 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1a9e0 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1a9f0 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1aa00 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1aa10 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1aa20 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
1aa30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1aa40 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
1aa50 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1aa60 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1aa70 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
1aa80 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
1aa90 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
1aaa0 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
1aab0 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
1aac0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
1aad0 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
1aae0 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
1aaf0 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
1ab00 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
1ab10 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
1ab20 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
1ab30 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
1ab40 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1ab50 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
1ab60 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1ab70 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
1ab80 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
1ab90 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
1aba0 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
1abb0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1abc0 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
1abd0 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
1abe0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28  cate(pFile->h, (
1abf0 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20  off_t)nByte);.  
1ac00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
1ac10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1ac20 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1ac30 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1ac40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ac50 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1ac60 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1ac70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e  );.  }else{.#ifn
1ac80 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
1ac90 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1aca0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1acb0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1acc0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1acd0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1ace0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1acf0 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1ad00 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1ad10 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1ad20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1ad30 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1ad40 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1ad50 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1ad60 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1ad70 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1ad80 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1ad90 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1ada0 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1adb0 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1adc0 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1add0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1ade0 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1adf0 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1ae00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ae10 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1ae20 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1ae30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1ae40 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1ae50 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1ae60 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
1ae70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1ae80 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1ae90 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1aea0 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1aeb0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1aec0 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1aed0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1aee0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1aef0 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1af00 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1af10 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1af20 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
1af30 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
1af40 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
1af50 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1af60 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1af70 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1af80 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1af90 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1afa0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1afb0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1afc0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1afd0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1afe0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1aff0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1b000 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1b010 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1b020 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1b030 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1b040 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1b050 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1b060 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1b070 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1b080 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1b090 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1b0a0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1b0b0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1b0c0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1b0d0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1b0e0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1b0f0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1b100 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1b110 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1b120 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1b130 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1b140 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1b150 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1b160 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1b170 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1b180 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1b190 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1b1a0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1b1b0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1b1c0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1b1d0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1b1e0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1b1f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1b200 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1b210 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1b220 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1b230 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b240 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1b250 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1b260 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1b270 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1b280 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
1b290 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1b2a0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1b2b0 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1b2c0 73 20 66 69 6c 65 2c 20 69 74 20 63 6f 75 6c 64  s file, it could
1b2d0 20 62 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20   be.** that the 
1b2e0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1b2f0 20 65 78 74 65 6e 64 65 64 20 61 74 20 74 68 69   extended at thi
1b300 73 20 70 6f 69 6e 74 2e 20 4f 74 68 65 72 77 69  s point. Otherwi
1b310 73 65 2c 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54  se, the.** SQLIT
1b320 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1b330 54 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  T operation is a
1b340 20 6e 6f 2d 6f 70 20 66 6f 72 20 55 6e 69 78 2e   no-op for Unix.
1b350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1b360 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1b370 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1b380 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1b390 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29  pFile->szChunk )
1b3a0 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3c0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1b3d0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1b3e0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1b3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b400 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1b410 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1b420 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1b430 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1b440 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1b450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b460 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1b470 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1b480 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1b490 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1b4a0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1b4b0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1b4c0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1b4d0 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1b4e0 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1b4f0 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1b500 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1b510 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1b520 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1b530 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1b540 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1b550 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1b560 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1b570 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1b580 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1b590 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1b5a0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1b5b0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1b5c0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1b5d0 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1b5e0 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1b5f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1b600 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1b610 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1b620 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1b630 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1b640 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1b650 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1b660 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1b670 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1b680 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b690 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1b6a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1b6b0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1b6c0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1b6d0 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1b6e0 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1b6f0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1b700 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1b710 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1b720 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1b730 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1b740 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1b750 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1b760 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1b770 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1b780 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1b790 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1b7a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1b7b0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1b7c0 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1b7d0 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1b7e0 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1b7f0 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1b800 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1b810 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1b820 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1b830 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1b840 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1b850 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b870 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1b880 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 20 20  write to */.    
1b890 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 20 20 20    int nWrite;   
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b8b0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
1b8c0 6f 6d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28  om seekAndWrite(
1b8d0 29 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  ) */..      if( 
1b8e0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1b8f0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
1b900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
1b910 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1b920 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
1b930 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1b940 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1b950 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1b960 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1b970 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1b980 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
1b990 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
1b9a0 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
1b9b0 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 64 6f 20  Blk-1;.      do 
1b9c0 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65  {.        nWrite
1b9d0 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1b9e0 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1b9f0 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1ba00 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1ba10 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 6e 57       } while( nW
1ba20 72 69 74 65 3d 3d 31 20 26 26 20 69 57 72 69 74  rite==1 && iWrit
1ba30 65 3c 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  e<nSize );.     
1ba40 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1ba50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ba60 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6e 64  OERR_WRITE;.#end
1ba70 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1ba80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ba90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  ;.}../*.** Infor
1baa0 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1bab0 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1bac0 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1bad0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1bae0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1baf0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1bb00 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1bb10 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1bb20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bb30 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1bb40 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1bb50 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1bb60 65 2a 29 69 64 29 2d 3e 65 46 69 6c 65 4c 6f 63  e*)id)->eFileLoc
1bb70 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
1bb80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1bb90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bba0 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1bbb0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1bbc0 20 3d 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69   = ((unixFile*)i
1bbd0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
1bbe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bbf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1bc00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1bc10 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1bc20 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1bc30 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20  e*)id)->szChunk 
1bc40 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1bc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bc60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1bc70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1bc80 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1bc90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 63  .      return fc
1bca0 6e 74 6c 53 69 7a 65 48 69 6e 74 28 28 75 6e 69  ntlSizeHint((uni
1bcb0 78 46 69 6c 65 20 2a 29 69 64 2c 20 2a 28 69 36  xFile *)id, *(i6
1bcc0 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  4 *)pArg);.    }
1bcd0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bce0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1bcf0 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1bd00 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1bd10 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1bd20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1bd30 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1bd40 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1bd50 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1bd60 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1bd70 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1bd80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1bd90 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1bda0 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1bdb0 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1bdc0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1bdd0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1bde0 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1bdf0 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1be00 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1be10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1be20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1be30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1be40 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1be50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1be60 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1be70 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1be80 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1be90 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1bea0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1beb0 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1bec0 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1bed0 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1bee0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1bef0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1bf00 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1bf10 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
1bf20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1bf30 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
1bf40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bf50 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
1bf60 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
1bf70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bf80 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1bf90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1bfa0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1bfb0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1bfc0 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1bfd0 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1bfe0 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1bff0 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1c000 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1c010 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1c020 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1c030 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1c040 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1c050 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1c060 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1c070 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1c080 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1c090 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1c0a0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1c0b0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1c0c0 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1c0d0 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1c0e0 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1c0f0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1c100 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1c110 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1c120 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1c130 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1c140 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1c150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c160 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1c170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1c180 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1c190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c1a0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1c1b0 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1c1c0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1c1d0 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1c1e0 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1c1f0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1c200 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1c210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1c220 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1c230 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1c240 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1c250 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c260 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1c270 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1c280 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1c290 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1c2a0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1c2b0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1c2c0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1c2d0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1c2e0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1c2f0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1c300 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1c310 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1c320 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1c330 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1c340 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1c350 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1c360 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1c370 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1c380 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1c390 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1c3a0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1c3b0 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1c3c0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1c3d0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1c3e0 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1c3f0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1c400 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1c410 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1c420 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1c430 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1c440 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1c450 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1c460 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1c470 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1c480 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1c490 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1c4a0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1c4b0 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1c4c0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1c4d0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1c4e0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1c4f0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1c500 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1c510 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1c520 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1c530 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1c540 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1c550 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1c560 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1c570 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1c580 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1c590 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1c5a0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1c5b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1c5c0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1c5d0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1c5e0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1c5f0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1c600 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1c610 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1c620 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1c630 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1c640 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1c650 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1c660 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1c670 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1c680 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1c690 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1c6a0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1c6b0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1c6c0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1c6d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1c6e0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1c6f0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1c700 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1c710 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1c720 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1c730 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1c740 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1c750 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1c760 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1c770 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1c780 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1c790 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c7a0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1c7b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1c7e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1c7f0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c810 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1c820 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1c830 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c850 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1c860 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  pRegion */.  cha
1c870 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1c880 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1c890 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1c8a0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1c8b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1c8e0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1c8f0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1c900 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1c910 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1c920 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1c930 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1c940 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1c950 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c960 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1c970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c980 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1c990 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1c9a0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1c9c0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1c9d0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1c9e0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1c9f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1ca00 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1ca10 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1ca20 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1ca30 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1ca40 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1ca50 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1ca60 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1ca70 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1ca80 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1ca90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1caa0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1cab0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1cac0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1cad0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1cae0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1caf0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1cb00 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1cb10 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1cb20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1cb30 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1cb40 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1cb50 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1cb60 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1cb70 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1cb80 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1cb90 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1cba0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1cbb0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1cbc0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1cbd0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1cbe0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1cbf0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1cc00 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1cc10 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1cc20 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1cc30 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1cc40 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1cc50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1cc60 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1cc70 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1cc80 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1cc90 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1cca0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1ccb0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1ccc0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1ccd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1cce0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1ccf0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1cd00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cd10 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
1cd40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
1cd50 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
1cd60 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
1cd70 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
1cd80 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1cd90 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
1cda0 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
1cdb0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1cdc0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
1cdd0 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1cde0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
1cdf0 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
1ce00 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
1ce10 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1ce20 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1ce30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1ce40 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
1ce50 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
1ce60 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
1ce70 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
1ce80 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
1ce90 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
1cea0 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
1ceb0 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
1cec0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
1ced0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1cee0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
1cef0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
1cf00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
1cf10 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
1cf20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
1cf30 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1cf40 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
1cf50 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
1cf60 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
1cf70 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
1cf80 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1cf90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cfa0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1cfb0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
1cfc0 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
1cfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1cfe0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1cff0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
1d000 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
1d010 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
1d020 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
1d030 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1d040 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d050 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
1d060 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
1d070 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1d080 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
1d090 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1d0a0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1d0b0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1d0c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d0d0 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
1d0e0 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
1d0f0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
1d100 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
1d110 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
1d120 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
1d130 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d140 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
1d150 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
1d160 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
1d170 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
1d180 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
1d190 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1d1a0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1d1b0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
1d1c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1d1d0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1d1e0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
1d1f0 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
1d200 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
1d210 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
1d220 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
1d230 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
1d240 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
1d250 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
1d260 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
1d270 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
1d280 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
1d290 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
1d2a0 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
1d2b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d2c0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d2d0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
1d2e0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
1d2f0 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
1d300 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d310 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
1d320 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1d330 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
1d340 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
1d350 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
1d360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d370 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
1d380 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
1d390 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d3a0 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
1d3b0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
1d3c0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
1d3d0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1d3e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
1d3f0 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1d400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
1d410 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
1d420 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1d430 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
1d440 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d450 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d460 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1d470 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d480 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d490 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
1d4a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
1d4b0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
1d4c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1d4d0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
1d4e0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
1d4f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
1d500 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1d510 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
1d520 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
1d530 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1d540 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
1d550 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
1d560 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1d570 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
1d580 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
1d590 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
1d5a0 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
1d5b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
1d5c0 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
1d5d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d5e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
1d5f0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
1d600 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1d610 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
1d620 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
1d630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
1d640 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
1d650 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
1d660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
1d670 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
1d680 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
1d690 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
1d6a0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1d6b0 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
1d6c0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
1d6d0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
1d6e0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
1d6f0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
1d700 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1d710 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1d720 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d730 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1d740 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1d750 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1d760 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d770 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1d780 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
1d790 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
1d7a0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
1d7b0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
1d7c0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
1d7e0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1d7f0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
1d800 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
1d810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1d820 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
1d830 6e 6f 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20  node );.    if( 
1d840 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
1d850 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1d860 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1d870 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1d880 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1d890 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1d8a0 20 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d         munmap(p-
1d8b0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
1d8c0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
1d8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d8e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1d8f0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
1d900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d910 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1d920 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
1d930 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
1d940 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1d950 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
1d960 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
1d970 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
1d980 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
1d990 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
1d9a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1d9b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
1d9c0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
1d9d0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
1d9e0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
1d9f0 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1da00 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
1da10 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
1da20 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
1da30 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1da40 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
1da50 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
1da60 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
1da70 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
1da80 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
1da90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1daa0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
1dab0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
1dac0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dad0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
1dae0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
1daf0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1db00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1db10 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
1db20 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
1db30 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
1db40 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
1db50 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
1db60 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
1db70 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
1db80 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
1db90 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
1dba0 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
1dbb0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
1dbc0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
1dbd0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
1dbe0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
1dbf0 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
1dc00 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
1dc10 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1dc20 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
1dc30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc40 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
1dc50 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
1dc60 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
1dc70 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
1dc80 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
1dc90 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
1dca0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
1dcb0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
1dcc0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
1dcd0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
1dce0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
1dcf0 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
1dd00 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
1dd10 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
1dd20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
1dd30 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
1dd40 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
1dd50 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
1dd60 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
1dd70 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
1dd80 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1dd90 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
1dda0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
1ddb0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
1ddc0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1ddd0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
1dde0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
1ddf0 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
1de00 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
1de10 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
1de20 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
1de30 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
1de40 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
1de50 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
1de60 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
1de70 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
1de80 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
1de90 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
1dea0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
1deb0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
1dec0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ded0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1dee0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
1def0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
1df00 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1df10 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
1df20 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
1df30 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
1df40 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
1df50 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
1df60 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
1df70 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
1df80 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
1df90 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
1dfa0 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
1dfb0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
1dfc0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
1dfd0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
1dfe0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
1dff0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
1e000 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
1e010 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
1e020 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
1e030 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
1e040 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1e050 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
1e060 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
1e070 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
1e080 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
1e090 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
1e0a0 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
1e0b0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1e0c0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1e0d0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1e0e0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
1e0f0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1e100 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1e110 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
1e120 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
1e130 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
1e140 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
1e150 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
1e160 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
1e170 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
1e180 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
1e190 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
1e1a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e1b0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
1e1c0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
1e1d0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1e1e0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
1e1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e200 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1e210 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1e220 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1e230 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
1e240 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1e250 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1e260 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1e290 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
1e2a0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
1e2b0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
1e2c0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
1e2d0 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1e300 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
1e310 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
1e320 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1e330 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1e340 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
1e350 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
1e360 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1e370 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
1e380 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
1e390 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
1e3a0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
1e3b0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
1e3c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e3d0 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
1e3e0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1e3f0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
1e400 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
1e410 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1e420 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
1e430 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
1e440 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
1e450 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
1e460 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
1e470 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1e480 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
1e490 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
1e4a0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1e4b0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
1e4c0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
1e4d0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
1e4e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1e4f0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
1e500 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
1e510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e520 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
1e530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e540 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
1e550 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
1e560 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
1e570 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
1e580 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
1e590 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
1e5a0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
1e5b0 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
1e5c0 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
1e5d0 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
1e5e0 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
1e5f0 73 73 69 6f 6e 73 2e 20 54 68 65 20 61 63 74 75  ssions. The actu
1e600 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74  al permissions t
1e610 68 65 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  he file is creat
1e620 65 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  ed.    ** with a
1e630 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  re subject to th
1e640 65 20 63 75 72 72 65 6e 74 20 75 6d 61 73 6b 20  e current umask 
1e650 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1e660 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
1e670 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
1e680 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72  ) && pInode->bPr
1e690 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
1e6a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e6b0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1e6c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1e6d0 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
1e6e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
1e6f0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
1e700 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
1e710 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
1e720 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 30 3b  DIRECTORY) + 30;
1e730 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
1e740 69 6c 65 6e 61 6d 65 20 3d 20 35 20 2b 20 28 69  ilename = 5 + (i
1e750 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d  nt)strlen(pDbFd-
1e760 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
1e770 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73      pShmNode = s
1e780 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1e790 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1e7a0 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
1e7b0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1e7c0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
1e7d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e7e0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1e7f0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1e800 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
1e810 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
1e820 28 2a 70 53 68 6d 4e 6f 64 65 29 29 3b 0a 20 20  (*pShmNode));.  
1e830 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d    zShmFilename =
1e840 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1e850 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1e860 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64  ShmNode[1];.#ifd
1e870 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
1e880 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69  RECTORY.    sqli
1e890 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
1e8a0 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46  mFilename, zShmF
1e8b0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ilename, .      
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1e8d0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e8e0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
1e8f0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
1e910 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
1e920 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
1e930 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
1e940 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1e950 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
1e960 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  hmFilename, "%s-
1e970 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
1e980 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
1e990 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
1e9a0 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
1e9b0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
1e9c0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
1e9d0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
1e9e0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
1e9f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1ea00 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1ea10 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1ea20 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1ea30 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ea40 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1ea50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1ea60 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1ea70 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1ea80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
1ea90 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
1eaa0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53  k==0 ){.      pS
1eab0 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75  hmNode->h = robu
1eac0 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65  st_open(zShmFile
1ead0 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  name, O_RDWR|O_C
1eae0 52 45 41 54 2c 0a 20 20 20 20 20 20 20 20 20 20  REAT,.          
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d       (sStat.st_m
1eb10 6f 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20  ode & 0777));.  
1eb20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1eb30 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ->h<0 ){.       
1eb40 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
1eb50 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1eb60 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
1eb70 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
1eb80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1eb90 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
1eba0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43   }.  .      /* C
1ebb0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1ebc0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1ebd0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1ebe0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1ebf0 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
1ec00 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1ec10 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1ec20 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1ec30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ec40 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
1ec50 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ec60 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
1ec70 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
1ec80 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1ec90 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
1eca0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
1ecb0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
1ecc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1ecd0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1ece0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
1ecf0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
1ed00 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1ed10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ed20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ed30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ed40 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
1ed50 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1ed60 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
1ed70 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
1ed80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ed90 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1eda0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1edb0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1edc0 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1edd0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1ede0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
1edf0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
1ee00 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
1ee10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
1ee20 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1ee30 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1ee40 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1ee50 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1ee60 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
1ee70 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1ee80 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1ee90 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1eea0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1eeb0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1eec0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1eed0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
1eee0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
1eef0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1ef00 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1ef10 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1ef20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
1ef30 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1ef40 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1ef50 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1ef60 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1ef70 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1ef80 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1ef90 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1efa0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1efb0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1efc0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1efd0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1efe0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1eff0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1f000 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1f010 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1f020 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1f030 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1f040 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1f050 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1f060 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f070 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1f080 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1f0a0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1f0b0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1f0c0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
1f0d0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
1f0e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
1f0f0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1f100 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1f110 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f120 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
1f130 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1f140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f160 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1f170 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1f180 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1f190 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1f1a0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1f1b0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1f1c0 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1f1d0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f1e0 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1f1f0 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1f200 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1f210 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f220 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1f230 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1f240 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f250 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1f260 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f270 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1f280 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1f290 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1f2a0 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
1f2b0 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1f2c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1f2d0 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1f2e0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1f2f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1f300 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1f310 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1f320 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1f330 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1f340 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1f350 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1f360 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1f370 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
1f380 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1f390 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1f3a0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1f3b0 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1f3c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1f3d0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1f3e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1f3f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1f400 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f410 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f420 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1f430 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1f440 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1f450 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1f460 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1f470 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1f480 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1f490 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1f4a0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1f4b0 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1f4c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1f4d0 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1f4e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1f4f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f500 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
1f510 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1f520 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1f530 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1f540 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1f550 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1f560 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f570 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1f580 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1f590 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1f5a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f5b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1f5c0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1f5d0 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f5f0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1f600 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1f610 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1f620 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1f630 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1f640 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1f650 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
1f660 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
1f670 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
1f680 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
1f690 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1f6a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f6b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
1f6c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1f6d0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1f6e0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1f6f0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
1f700 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1f710 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
1f720 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1f730 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
1f740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f750 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1f760 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1f770 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
1f780 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
1f790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f7a0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1f7b0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1f7c0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1f7d0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1f7e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f7f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1f800 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
1f810 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
1f820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1f830 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
1f840 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
1f850 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
1f860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1f870 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
1f880 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
1f890 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
1f8a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1f8b0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
1f8c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
1f8d0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1f8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1f8f0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
1f900 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
1f910 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
1f920 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
1f930 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
1f940 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
1f950 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
1f960 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
1f970 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
1f980 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
1f990 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1f9a0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1f9b0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1f9c0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1f9d0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1f9e0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1f9f0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1fa00 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1fa10 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
1fa20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1fa30 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
1fa40 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
1fa50 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
1fa60 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
1fa70 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1fa80 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1fa90 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1faa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fab0 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
1fac0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
1fad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fae0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1faf0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
1fb00 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1fb10 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1fb20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
1fb30 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
1fb40 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1fb50 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1fb60 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1fb70 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
1fb80 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
1fb90 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
1fba0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
1fbb0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1fbc0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1fbd0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
1fbe0 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
1fbf0 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
1fc00 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
1fc10 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
1fc20 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
1fc30 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
1fc40 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1fc50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1fc60 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
1fc70 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
1fc80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
1fc90 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
1fca0 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
1fcb0 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1fcc0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
1fcd0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1fce0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72  RR_SHMSIZE, "ftr
1fcf0 75 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20  uncate",.       
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
1fd20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1fd30 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1fd40 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
1fd50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fd60 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
1fd70 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1fd80 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
1fd90 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1fda0 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
1fdb0 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   apNew = (char *
1fdc0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1fdd0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1fde0 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28  ode->apRegion, (
1fdf0 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1fe00 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
1fe10 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1fe20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1fe30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1fe40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1fe50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1fe60 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
1fe70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1fe80 20 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f      while(pShmNo
1fe90 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
1fea0 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69  gion){.      voi
1feb0 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
1fec0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
1fed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
1fee0 6d 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65  m = mmap(0, szRe
1fef0 67 69 6f 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c  gion, PROT_READ|
1ff00 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
1ff10 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
1ff20 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
1ff30 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1ff40 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 0a 20 20 20  ion*szRegion.   
1ff50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1ff60 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
1ff70 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
1ff80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1ff90 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ERR;.          g
1ffa0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1ffb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ffc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ffd0 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
1ffe0 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b  alloc(szRegion);
1fff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20000 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
20010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20020 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
20030 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20050 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
20060 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
20070 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
20080 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70  Node->apRegion[p
20090 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
200a0 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20 20  ] = pMem;.      
200b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
200c0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
200d0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
200e0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
200f0 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
20100 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
20110 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
20120 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
20130 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
20140 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20150 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
20160 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
20170 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
20180 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
20190 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
201a0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
201b0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
201c0 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
201d0 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
201e0 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
201f0 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
20200 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
20210 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
20220 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
20230 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
20240 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
20250 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
20260 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
20270 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
20280 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
20290 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
202a0 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
202b0 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
202c0 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
202d0 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
202e0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
202f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
20300 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
20310 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
20320 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
20330 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
20340 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
20350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
20360 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
20370 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
20380 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
203a0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
203b0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
203c0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
203d0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
203e0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
203f0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
20400 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
20410 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
20420 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
20430 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
20440 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
20450 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
20460 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
20470 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
20480 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
20490 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
204a0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
204b0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204d0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
204e0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
204f0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20500 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
20510 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
20520 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
20530 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
20540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
20570 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
205a0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
205b0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
205c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
205d0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
205e0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
205f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
20600 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
20610 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
20620 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
20630 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
20640 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
20650 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
20660 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
20670 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
20680 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
20690 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
206a0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
206b0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
206c0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
206d0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
206e0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
206f0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
20700 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
20710 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
20720 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
20730 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
20740 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
20750 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
20760 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
20770 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
20780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
20790 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
207a0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
207b0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
207c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
207d0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
207e0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
207f0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
20800 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
20810 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
20820 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
20830 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
20840 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
20850 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
20860 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
20870 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
20880 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
20890 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
208a0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
208b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
208c0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
208d0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
208e0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
208f0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
20900 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
20910 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
20920 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
20930 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
20940 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20950 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
20960 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
20970 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
20980 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
20990 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
209a0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
209b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
209c0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
209d0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
209e0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
209f0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
20a00 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
20a10 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
20a20 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
20a30 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
20a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20a50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20a60 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
20a70 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
20a80 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
20a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20aa0 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
20ab0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
20ac0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
20ad0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
20ae0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
20af0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
20b00 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
20b10 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
20b20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
20b30 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
20b40 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
20b50 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
20b60 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
20b70 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
20b80 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
20b90 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
20ba0 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
20bb0 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
20bc0 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
20bd0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
20be0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
20bf0 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
20c00 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
20c10 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
20c20 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
20c30 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
20c40 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
20c50 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
20c60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
20c70 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
20c80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20c90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
20ca0 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
20cb0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
20cc0 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
20cd0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
20ce0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
20cf0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
20d00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
20d20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
20d30 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
20d40 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
20d50 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
20d60 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
20d70 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
20d80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20d90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
20da0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
20db0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
20dc0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
20dd0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
20de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20df0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
20e00 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
20e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
20e20 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
20e30 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
20e40 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
20e50 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
20e60 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
20e70 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
20e80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
20e90 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
20ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
20eb0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
20ec0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
20ed0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
20ee0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
20ef0 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
20f00 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
20f10 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
20f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20f30 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
20f40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20f50 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
20f60 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
20f70 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
20f80 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
20f90 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
20fa0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
20fb0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
20fc0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
20fd0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
20fe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20ff0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
21000 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
21010 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
21020 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
21030 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
21040 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21060 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
21070 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
21080 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
21090 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
210a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
210b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
210c0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
210d0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
210e0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
210f0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
21100 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
21110 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
21120 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
21130 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
21140 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
21150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21160 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
21170 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
21180 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
21190 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
211a0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
211b0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
211c0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
211d0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
211e0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
211f0 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
21200 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
21210 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
21220 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
21230 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
21240 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
21250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
21260 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
21270 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
21280 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
21290 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
212a0 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
212b0 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
212c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
212d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
212e0 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
212f0 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
21300 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
21310 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
21320 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
21330 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
21340 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
21350 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
21360 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
21370 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
21380 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
21390 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
213a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
213b0 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
213c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
213e0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
213f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21400 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
21410 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
21420 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
21430 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
21440 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
21450 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
21460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21470 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
21480 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
21490 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
214a0 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
214b0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
214c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
214d0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
214e0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
214f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
21500 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
21510 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
21520 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
21530 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
21540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
21550 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
21560 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
21570 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
21580 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
21590 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
215a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
215b0 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
215c0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
215d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
215e0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
215f0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
21600 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21610 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
21620 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
21630 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
21640 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
21650 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
21660 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
21670 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
21680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
21690 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
216a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
216b0 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
216c0 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
216d0 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
216e0 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
216f0 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
21700 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
21710 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
21720 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
21730 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
21740 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21750 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
21760 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
21770 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
21780 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
21790 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
217a0 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
217b0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
217c0 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
217d0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
217e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
217f0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
21800 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
21810 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
21820 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
21830 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
21840 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 75  hmNode->h>=0 ) u
21850 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
21860 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
21870 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
21880 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
21890 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
218a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
218b0 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
218c0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
218d0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
218e0 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
218f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
21900 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
21910 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
21920 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
21930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21940 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
21950 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
21960 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
21970 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
21980 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
21990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
219a0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
219b0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
219c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
219d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
219e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
219f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
21a30 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
21a40 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
21a50 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
21a60 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
21a70 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
21a80 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
21a90 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
21aa0 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
21ab0 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
21ac0 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
21ad0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
21ae0 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
21af0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
21b00 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
21b10 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
21b20 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
21b30 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
21b40 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
21b50 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
21b60 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
21b70 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
21b80 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
21b90 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
21ba0 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
21bb0 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
21bc0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
21bd0 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
21be0 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
21bf0 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
21c00 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
21c10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
21c20 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
21c30 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
21c40 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
21c50 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
21c60 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
21c70 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
21c80 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
21c90 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
21ca0 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
21cb0 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
21cc0 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
21cd0 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f  or finder-funtio
21ce0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
21cf0 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
21d00 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
21d10 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
21d20 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
21d30 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
21d40 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
21d50 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
21d60 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
21d70 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
21d80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21d90 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
21da0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
21db0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
21dc0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
21dd0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
21de0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
21df0 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
21e00 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
21e10 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
21e20 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
21e30 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
21e40 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
21e50 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
21e60 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
21e70 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
21e80 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
21e90 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
21ea0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
21eb0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
21ec0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
21ed0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
21ee0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
21ef0 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
21f00 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
21f10 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
21f20 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
21f30 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
21f40 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
21f50 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
21f60 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
21f70 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
21f80 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
21f90 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
21fa0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
21fb0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
21fc0 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56  INDER, METHOD, V
21fd0 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c  ERSION, CLOSE, L
21fe0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c  OCK, UNLOCK, CKL
21ff0 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74  OCK)      \.stat
22000 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
22010 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
22020 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
22050 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
22060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
22070 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
220a0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
220b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
220c0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
220f0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
22100 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
22110 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
22140 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
22150 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
22160 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
22190 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
221a0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
221b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
221e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
221f0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
22230 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
22240 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
22250 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
22340 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
22360 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
22370 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
22380 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
22390 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
223b0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
223c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
223d0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
22400 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
22410 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
22420 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
22430 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
22440 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
22450 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20   unixShmMap,    
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22470 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
224a0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
224b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
224c0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
224f0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
22500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22510 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
22540 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  ixShmUnmap      
22550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
22560 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
225e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
225f0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
22600 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
22610 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
22620 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
22630 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
22640 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22650 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22670 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
22680 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
22720 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
22730 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
22740 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
22750 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
22760 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
22770 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
22780 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
22790 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
227a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
227b0 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
227c0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
227d0 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
227e0 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
227f0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
22800 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
22810 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
22820 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
22830 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
22840 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
22850 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
22860 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
22870 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
22880 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
22890 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
228a0 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
228d0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e   enabled */.  un
228e0 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
228f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
22900 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
22910 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
22920 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
22930 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
22940 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  xUnlock,        
22950 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
22960 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
22970 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
22980 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ock     /* xChec
22990 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
229a0 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
229b0 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
229c0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
229d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
229e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
229f0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
22a00 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
22a10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22a20 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
22a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22a40 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
22a50 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
22a60 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
22a70 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
22a80 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
22a90 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
22aa0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
22ab0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
22ac0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
22ad0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
22ae0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
22af0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
22b00 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
22b10 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck   /* xCheckRe
22b20 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
22b30 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
22b40 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e  (.  dotlockIoFin
22b50 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  der,          /*
22b60 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
22b70 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
22b80 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
22b90 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
22ba0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
22bb0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
22be0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
22bf0 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  ed */.  dotlockC
22c00 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
22c10 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
22c20 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c  od */.  dotlockL
22c30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
22c40 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
22c50 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  d */.  dotlockUn
22c60 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
22c70 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
22c80 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43  od */.  dotlockC
22c90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22ca0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
22cb0 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
22cc0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
22cd0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
22ce0 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
22cf0 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  RKS.IOMETHODS(. 
22d00 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
22d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22d20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
22d30 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
22d40 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
22d50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
22d60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
22d70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
22da0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
22db0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22dd0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
22de0 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
22e10 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
22e40 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
22e50 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f  eservedLock    /
22e60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
22e70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
22e80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
22e90 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
22ea0 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
22eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22ec0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
22ed0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
22ee0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
22ef0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
22f00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
22f10 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
22f40 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
22f50 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73  led */.  semClos
22f60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22f70 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
22f80 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b  hod */.  semLock
22f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fa0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
22fb0 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63  od */.  semUnloc
22fc0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
22fd0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
22fe0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63  hod */.  semChec
22ff0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
23000 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23010 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23020 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
23030 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
23040 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
23050 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23060 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
23070 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
23080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23090 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
230a0 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
230b0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
230c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
230d0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
230e0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
23110 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
23120 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23140 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
23150 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23170 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
23180 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231a0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
231b0 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
231c0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
231d0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
231e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
231f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
23200 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
23210 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
23220 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
23230 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
23240 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
23250 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
23260 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
23270 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
23280 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
23290 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
232a0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
232b0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
232c0 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
232d0 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
232e0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
232f0 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
23300 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
23310 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
23320 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
23330 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
23340 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
23350 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
23360 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
23370 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
23380 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
23390 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
233a0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
233b0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
233c0 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
233d0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
233e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
233f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
23400 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
23410 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
23420 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
23430 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
23440 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
23450 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
23460 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
23470 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
23480 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
23490 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
234a0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
234b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
234c0 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
234d0 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
234e0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
234f0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23500 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
23510 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
23520 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
23530 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
23540 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
23550 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
23570 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
23580 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
23590 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
235a0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
235b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
235c0 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
235d0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
235e0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
235f0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
23600 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23610 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
23620 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
23630 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
23640 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
23650 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
23660 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
23670 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
23680 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
23690 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
236a0 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
236b0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
236c0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
236d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
236e0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
236f0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23710 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
23720 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
23730 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
23740 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
23750 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
23760 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23790 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
237a0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
237b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
237c0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
237d0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
237e0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
237f0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
23800 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
23810 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23820 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23830 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
23840 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23850 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k      /* xCheck
23860 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
23870 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
23880 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
23890 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
238a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
238b0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
238c0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
238d0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
238e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
238f0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
23900 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
23910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
23920 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
23930 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
23940 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23950 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
23960 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
23970 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
23980 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
23990 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
239a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
239b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
239c0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
239d0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
239e0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
239f0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
23a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
23a10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
23a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
23a30 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
23a40 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23a50 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
23a60 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
23a70 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
23a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
23a90 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
23aa0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
23ab0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
23ac0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
23ad0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
23ae0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
23af0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
23b00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
23b10 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
23b20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
23b30 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
23b40 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
23b50 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
23b60 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
23b70 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
23b80 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
23b90 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
23ba0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
23bb0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
23bc0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
23bd0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
23be0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
23bf0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
23c00 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
23c10 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
23c20 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
23c30 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
23c40 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
23c50 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
23c60 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
23c70 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
23c80 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
23c90 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
23ca0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
23cb0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
23cc0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
23cd0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
23ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
23cf0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
23d00 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
23d10 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
23d20 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
23d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
23d40 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
23d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
23d60 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
23d70 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
23d80 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
23d90 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
23da0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
23db0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
23dc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
23dd0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
23de0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
23df0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
23e00 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
23e10 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
23e20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
23e30 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
23e40 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
23e50 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
23e60 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
23e70 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
23e80 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
23e90 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
23ea0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
23eb0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
23ec0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
23ed0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
23ee0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
23ef0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
23f00 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
23f10 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
23f20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
23f30 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
23f40 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
23f50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
23f60 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
23f70 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
23f80 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
23f90 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
23fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
23fb0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
23fc0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
23fd0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
23fe0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
23ff0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
24000 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
24010 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
24020 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
24030 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
24040 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
24050 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24060 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24070 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
24080 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49  _VXWORKS && SQLI
24090 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
240a0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
240b0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
240c0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
240d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
240e0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
240f0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
24100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24110 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
24120 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
24130 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
24140 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
24150 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24160 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
24170 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56  ** This is for V
24180 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  XWorks only..*/.
24190 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
241a0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
241b0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
241c0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
241d0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
241e0 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
241f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24200 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
24210 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
24220 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
24230 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
24240 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
24250 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
24260 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
24270 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
24280 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
24290 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
242a0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
242b0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
242c0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
242d0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
242e0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
242f0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
24300 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
24310 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
24320 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
24330 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
24340 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
24350 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
24360 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
24370 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
24380 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
24390 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
243a0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
243b0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
243c0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
243d0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
243e0 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
243f0 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
24400 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
24410 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
24420 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
24430 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24440 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
24450 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
24460 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
24470 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
24480 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
24490 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
244a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
244b0 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
244c0 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
244d0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26  /* OS_VXWORKS &&
244e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
244f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
24500 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
24510 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
24520 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65  inter to a IO me
24530 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
24540 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
24550 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
24560 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
24570 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
24580 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
24590 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
245a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
245b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
245c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
245d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
245e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
245f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
24600 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
24610 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
24620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
24630 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
24640 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
24650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24660 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
24670 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
24680 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
24690 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
246a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
246b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
246c0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
246d0 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
246e0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
246f0 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
24700 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
24710 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
24720 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
24730 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
24740 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
24750 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
24760 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
24770 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66  ed */.  int dirf
24780 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24790 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c  /* Directory fil
247a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
247b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
247c0 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
247d0 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
247e0 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
247f0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
24800 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
24810 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
24820 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
24830 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c  */.  int noLock,
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24850 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69 66 20  Omit locking if 
24860 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  true */.  int is
24870 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
24880 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
24890 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  lose if true */.
248a0 20 20 69 6e 74 20 69 73 52 65 61 64 4f 6e 6c 79    int isReadOnly
248b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
248c0 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
248d0 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
248e0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
248f0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
24900 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  ds *pLockingStyl
24910 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e;.  unixFile *p
24920 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
24930 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20  *)pId;.  int rc 
24940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24950 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49  assert( pNew->pI
24960 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20  node==NULL );.. 
24970 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73   /* Parameter is
24980 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20 75  Delete is only u
24990 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  sed on vxworks. 
249a0 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78 70  Express this exp
249b0 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68 65  licitly .  ** he
249c0 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6f  re to prevent co
249d0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
249e0 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72  about unused par
249f0 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
24a00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24a10 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20 2f  (isDelete);..  /
24a20 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61  * Usually the pa
24a30 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f  th zFilename sho
24a40 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c  uld not be a rel
24a50 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
24a60 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69  The.  ** excepti
24a70 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69  on is when openi
24a80 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f  ng the proxy "co
24a90 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69  nch" file in bui
24aa0 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e  lds that.  ** in
24ab0 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61  clude the specia
24ac0 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20  l Apple locking 
24ad0 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66  styles..  */.#if
24ae0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
24af0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
24b00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24b10 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  LE.  assert( zFi
24b20 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
24b30 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a  lename[0]=='/' .
24b40 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70      || pVfs->pAp
24b50 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61  pData==(void*)&a
24b60 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
24b70 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72  );.#else.  asser
24b80 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
24b90 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
24ba0 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ='/' );.#endif..
24bb0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24bc0 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
24bd0 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
24be0 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
24bf0 20 70 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64   pNew->dirfd = d
24c00 69 72 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  irfd;.  pNew->zP
24c10 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
24c20 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 56  .  if( memcmp(pV
24c30 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d  fs->zName,"unix-
24c40 65 78 63 6c 22 2c 31 30 29 3d 3d 30 20 29 7b 0a  excl",10)==0 ){.
24c50 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
24c60 61 67 73 20 3d 20 55 4e 49 58 46 49 4c 45 5f 45  ags = UNIXFILE_E
24c70 58 43 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  XCL;.  }else{.  
24c80 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
24c90 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  s = 0;.  }.  if(
24ca0 20 69 73 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20   isReadOnly ){. 
24cb0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
24cc0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
24cd0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 23 69 66 20  DONLY;.  }..#if 
24ce0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65  OS_VXWORKS.  pNe
24cf0 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73  w->pId = vxworks
24d00 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65  FindFileId(zFile
24d10 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  name);.  if( pNe
24d20 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20  w->pId==0 ){.   
24d30 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20   noLock = 1;.   
24d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24d50 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  EM;.  }.#endif..
24d60 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 7b 0a    if( noLock ){.
24d70 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
24d80 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
24d90 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
24da0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
24db0 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
24dc0 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
24dd0 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
24de0 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
24df0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24e00 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
24e10 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
24e20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
24e30 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
24e40 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
24e50 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
24e60 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
24e70 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
24e80 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
24e90 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
24ea0 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
24eb0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
24ec0 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
24ed0 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
24ee0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
24ef0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
24f00 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
24f10 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
24f20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
24f30 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
24f40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
24f50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
24f60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24f70 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
24f80 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
24f90 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
24fa0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
24fb0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
24fc0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
24fd0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
24fe0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
24ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25000 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
25010 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
25020 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
25030 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
25040 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
25050 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
25060 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
25070 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
25080 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
25090 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
250a0 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
250b0 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
250c0 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
250d0 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
250e0 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
250f0 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
25100 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
25110 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
25120 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
25130 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
25140 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
25150 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
25160 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
25170 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
25180 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
25190 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
251a0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
251b0 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
251c0 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
251d0 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
251e0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
251f0 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
25200 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
25210 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
25220 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
25230 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
25240 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
25250 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
25260 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
25270 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
25280 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
25290 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
252a0 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
252b0 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
252c0 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
252d0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
252e0 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
252f0 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
25300 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
25310 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
25320 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
25330 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
25340 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
25350 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
25360 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
25370 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
25380 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
25390 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
253a0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
253b0 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
253c0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
253d0 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
253e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
253f0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
25400 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25410 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
25420 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
25430 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
25440 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
25450 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
25460 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
25470 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
25480 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
25490 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
254a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
254b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
254c0 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
254d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
254e0 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
254f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
25500 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
25510 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
25520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25530 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
25540 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c       /* NB: zFil
25550 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  ename exists and
25560 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
25570 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73  ntil the file is
25580 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a   closed.      **
25590 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
255a0 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31  quirement F11141
255b0 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20  .  So we do not 
255c0 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20  need to make a. 
255d0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
255e0 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
255f0 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50  .      pCtx->dbP
25600 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
25610 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73  .      pCtx->res
25620 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  erved = 0;.     
25630 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
25640 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
25650 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
25660 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
25670 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
25680 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
25690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
256a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
256b0 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b  _free(pNew->lock
256c0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
256d0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
256e0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
256f0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20  E__);.        h 
25700 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
25710 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
25720 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
25730 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
25740 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
25750 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
25760 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
25770 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
25780 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
25790 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
257a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
257b0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
257c0 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
257d0 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
257e0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
257f0 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
25800 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46  Filename;.    nF
25810 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
25820 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
25830 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
25840 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
25850 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69  lite3_malloc(nFi
25860 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
25870 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b   zLockFile==0 ){
25880 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
25890 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
258a0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
258b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c  e3_snprintf(nFil
258c0 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65  ename, zLockFile
258d0 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53  , "%s" DOTLOCK_S
258e0 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65  UFFIX, zFilename
258f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
25900 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
25910 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  t = zLockFile;. 
25920 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
25930 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  KS.  else if( pL
25940 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
25950 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  semIoMethods ){.
25960 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d      /* Named sem
25970 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75  aphore locking u
25980 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
25990 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
259a0 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75   be.    ** inclu
259b0 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f  ded in the semLo
259c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20  ckingContext.   
259d0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
259e0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
259f0 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
25a00 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
25a10 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28  node);.    if( (
25a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
25a30 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  & (pNew->pInode-
25a40 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a  >pSem==NULL) ){.
25a50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d        char *zSem
25a60 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e  Name = pNew->pIn
25a70 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20  ode->aSemName;. 
25a80 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
25a90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
25aa0 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c  tf(MAX_PATHNAME,
25ab0 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e   zSemName, "/%s.
25ac0 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  sem",.          
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
25ae0 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  w->pId->zCanonic
25af0 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  alName);.      f
25b00 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d  or( n=1; zSemNam
25b10 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20  e[n]; n++ ).    
25b20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65      if( zSemName
25b30 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e  [n]=='/' ) zSemN
25b40 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20  ame[n] = '_';.  
25b50 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
25b60 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65  ->pSem = sem_ope
25b70 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52  n(zSemName, O_CR
25b80 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20  EAT, 0666, 1);. 
25b90 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
25ba0 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53  Inode->pSem == S
25bb0 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  EM_FAILED ){.   
25bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25bd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25be0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
25bf0 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
25c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25c10 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
25c20 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
25c30 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74  .  .  pNew->last
25c40 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f  Errno = 0;.#if O
25c50 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
25c60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25c70 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
25c80 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
25c90 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
25ca0 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
25cb0 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
25cc0 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74 65  e);.    isDelete
25cd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
25ce0 2d 3e 69 73 44 65 6c 65 74 65 20 3d 20 69 73 44  ->isDelete = isD
25cf0 65 6c 65 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20  elete;.#endif.  
25d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25d10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 69 72  K ){.    if( dir
25d20 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63  fd>=0 ) robust_c
25d30 6c 6f 73 65 28 70 4e 65 77 2c 20 64 69 72 66 64  lose(pNew, dirfd
25d40 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
25d50 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
25d60 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
25d70 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
25d80 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
25d90 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
25da0 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
25db0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
25dc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25dd0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
25de0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
25df0 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
25e00 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
25e10 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
25e20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
25e30 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
25e40 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
25e50 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
25e60 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25e70 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
25e80 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
25e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
25ea0 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
25eb0 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
25ec0 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
25ed0 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
25ee0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  * value..**.** I
25ef0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
25f00 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
25f10 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
25f20 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a  le for closing.*
25f30 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
25f40 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67  iptor *pFd using
25f50 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61   close()..*/.sta
25f60 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65  tic int openDire
25f70 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
25f80 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74   *zFilename, int
25f90 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69   *pFd){.  int ii
25fa0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
25fb0 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65  .  char zDirname
25fc0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
25fd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
25fe0 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
25ff0 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25  ME, zDirname, "%
26000 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
26010 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74    for(ii=(int)st
26020 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20  rlen(zDirname); 
26030 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65  ii>1 && zDirname
26040 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29  [ii]!='/'; ii--)
26050 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a  ;.  if( ii>0 ){.
26060 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d      zDirname[ii]
26070 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20   = '\0';.    fd 
26080 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44  = robust_open(zD
26090 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
260a0 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
260b0 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a     if( fd>=0 ){.
260c0 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45  #ifdef FD_CLOEXE
260d0 43 0a 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28  C.      osFcntl(
260e0 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
260f0 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
26100 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
26110 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
26120 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
26130 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
26140 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
26150 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
26160 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
26170 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
26180 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
26190 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
261a0 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
261b0 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
261c0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
261d0 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
261e0 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
261f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
26200 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
26210 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
26220 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
26230 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
26240 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
26250 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
26260 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
26270 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
26280 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
26290 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
262a0 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
262b0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
262c0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
262d0 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20  p",.     0      
262e0 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
262f0 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75  ator */.  };.  u
26300 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
26310 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
26320 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
26330 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44  zDir = 0;..  azD
26340 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
26350 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
26360 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
26370 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
26380 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
26390 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
263a0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
263b0 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
263c0 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
263d0 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
263e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
263f0 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
26400 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
26410 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
26420 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
26430 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
26440 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
26450 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
26460 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
26470 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
26480 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
26490 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
264a0 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
264b0 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
264c0 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
264d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
264e0 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
264f0 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
26500 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
26510 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
26520 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
26530 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
26540 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
26550 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
26560 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
26570 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
26580 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
26590 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
265a0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
265b0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
265c0 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
265d0 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
265e0 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
265f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
26600 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  ir;..  /* It's o
26610 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
26620 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
26630 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
26640 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
26650 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
26660 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
26670 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
26680 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
26690 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
266a0 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
266b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
266c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
266d0 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
266e0 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
266f0 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
26700 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b  =0 ) zDir = ".";
26710 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
26720 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
26730 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
26740 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
26750 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
26760 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
26770 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
26780 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
26790 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69   if( (strlen(zDi
267a0 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49  r) + strlen(SQLI
267b0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
267c0 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 28 73  FIX) + 17) >= (s
267d0 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20  ize_t)nBuf ){.  
267e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
267f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
26800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
26810 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20  printf(nBuf-17, 
26820 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
26830 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
26840 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
26850 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
26860 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
26870 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
26880 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
26890 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
268a0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
268b0 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
268c0 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
268d0 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
268e0 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
268f0 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
26900 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
26910 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
26920 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
26930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26940 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
26950 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
26960 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
26970 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
26980 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
26990 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
269a0 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
269b0 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
269c0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
269d0 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
269e0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
269f0 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
26a00 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
26a10 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
26a20 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
26a30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26a40 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
26a50 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
26a60 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
26a70 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
26a80 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
26a90 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
26aa0 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
26ab0 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
26ac0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
26ad0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
26ae0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
26af0 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
26b00 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
26b10 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
26b20 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
26b30 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
26b40 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
26b50 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
26b60 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
26b70 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
26b80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
26b90 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
26ba0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
26bb0 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
26bc0 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
26bd0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
26be0 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
26bf0 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
26c00 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
26c10 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
26c20 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
26c30 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
26c40 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
26c50 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
26c60 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
26c70 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
26c80 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
26c90 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
26ca0 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
26cb0 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
26cc0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
26cd0 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
26ce0 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
26cf0 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
26d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
26d10 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
26d20 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
26d30 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
26d40 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
26d50 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
26d60 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
26d70 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
26d80 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
26d90 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
26da0 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
26db0 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
26dc0 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
26dd0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
26de0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
26df0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
26e00 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
26e10 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
26e20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
26e30 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
26e40 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
26e50 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
26e60 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
26e70 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
26e80 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
26e90 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
26ea0 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
26eb0 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
26ec0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
26ed0 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
26ee0 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
26ef0 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
26f00 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
26f10 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
26f20 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
26f30 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
26f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26f50 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
26f60 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
26f70 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
26f80 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
26f90 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
26fa0 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
26fb0 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
26fc0 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
26fd0 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
26fe0 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
26ff0 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
27000 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
27010 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
27020 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
27030 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
27040 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
27050 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
27060 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
27070 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
27080 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
27090 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
270a0 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
270b0 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
270c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
270d0 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
270e0 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
270f0 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
27100 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
27110 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
27120 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
27130 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
27140 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64  resusable file d
27150 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
27160 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
27170 28 20 30 3d 3d 73 74 61 74 28 7a 50 61 74 68 2c  ( 0==stat(zPath,
27180 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
27190 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
271a0 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
271b0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
271c0 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
271d0 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
271e0 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
271f0 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
27200 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
27230 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
27240 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
27250 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
27260 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
27270 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
27280 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
27290 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
272a0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
272b0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
272c0 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
272d0 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
272e0 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
272f0 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
27300 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
27310 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
27320 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
27330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27340 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
27350 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
27360 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
27370 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
27380 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
27390 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
273a0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
273b0 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
273c0 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
273d0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
273e0 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
273f0 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
27400 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
27410 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
27420 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
27430 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
27440 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
27450 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
27460 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
27470 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
27480 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
27490 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
274a0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
274b0 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
274c0 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
274d0 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
274e0 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
274f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   If the file bei
27500 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 74  ng opened is a t
27510 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 69  emporary file, i
27520 74 20 69 73 20 61 6c 77 61 79 73 20 63 72 65 61  t is always crea
27530 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
27540 6f 63 74 61 6c 20 70 65 72 6d 69 73 73 69 6f 6e  octal permission
27550 73 20 30 36 30 30 20 28 72 65 61 64 2f 77 72 69  s 0600 (read/wri
27560 74 61 62 6c 65 20 62 79 20 6f 77 6e 65 72 20 6f  table by owner o
27570 6e 6c 79 29 2e 20 49 66 20 74 68 65 20 66 69 6c  nly). If the fil
27580 65 0a 2a 2a 20 69 73 20 61 20 64 61 74 61 62 61  e.** is a databa
27590 73 65 20 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75  se or master jou
275a0 72 6e 61 6c 20 66 69 6c 65 2c 20 69 74 20 69 73  rnal file, it is
275b0 20 63 72 65 61 74 65 64 20 77 69 74 68 20 74 68   created with th
275c0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
275d0 2a 20 6d 61 73 6b 20 53 51 4c 49 54 45 5f 44 45  * mask SQLITE_DE
275e0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
275f0 53 53 49 4f 4e 53 2e 0a 2a 2a 0a 2a 2a 20 46 69  SSIONS..**.** Fi
27600 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 20 66 69  nally, if the fi
27610 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
27620 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
27630 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
27640 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
27650 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
27660 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
27670 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
27680 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
27690 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
276a0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
276b0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
276c0 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
276d0 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
276e0 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
276f0 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
27700 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
27710 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
27720 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
27730 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
27740 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
27750 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  t findCreateFile
27760 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Mode(.  const ch
27770 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
27780 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
27790 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c  of file (possibl
277a0 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  y) being created
277b0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
277e0 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67  assed as 4th arg
277f0 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29  ument to xOpen()
27800 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d   */.  mode_t *pM
27810 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
27820 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65        /* OUT: Pe
27830 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65  rmissions to ope
27840 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29  n file with */.)
27850 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27860 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
27870 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
27880 64 65 20 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67  de */.  if( flag
27890 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
278a0 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
278b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
278c0 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d  {.    char zDb[M
278d0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20  AX_PATHNAME+1]; 
278e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
278f0 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20  file path */.   
27900 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20   int nDb;       
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27920 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
27930 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a  d bytes in zDb *
27940 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
27950 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
27960 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66      /* Output of
27970 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62   stat() on datab
27980 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
27990 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70   /* zPath is a p
279a0 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20  ath to a WAL or 
279b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
279c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
279d0 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a  k derives.    **
279e0 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
279f0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
27a00 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a  base file from z
27a10 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b  Path. This block
27a20 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20   handles.    ** 
27a30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61  the following na
27a40 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ming conventions
27a50 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
27a60 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
27a70 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20  journal".    ** 
27a80 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
27a90 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  wal".    **   "<
27aa0 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
27ab0 6e 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a 2a  nal-NNNN".    **
27ac0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
27ad0 2d 77 61 6c 2d 4e 4e 4e 4e 22 0a 20 20 20 20 2a  -wal-NNNN".    *
27ae0 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
27af0 4e 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69 74  NNN is a 4 digit
27b00 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e   decimal number.
27b10 20 54 68 65 20 4e 4e 4e 4e 20 6e 61 6d 69 6e 67   The NNNN naming
27b20 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
27b30 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
27b40 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
27b50 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
27b60 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
27b70 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
27b80 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
27b90 65 28 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74  e( nDb>0 && zPat
27ba0 68 5b 6e 44 62 5d 21 3d 27 6c 27 20 29 20 6e 44  h[nDb]!='l' ) nD
27bb0 62 2d 2d 3b 0a 20 20 20 20 6e 44 62 20 2d 3d 20  b--;.    nDb -= 
27bc0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
27bd0 5f 4f 50 45 4e 5f 57 41 4c 29 20 3f 20 33 20 3a  _OPEN_WAL) ? 3 :
27be0 20 37 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   7);.    memcpy(
27bf0 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29  zDb, zPath, nDb)
27c00 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d  ;.    zDb[nDb] =
27c10 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20   '\0';..    if( 
27c20 30 3d 3d 73 74 61 74 28 7a 44 62 2c 20 26 73 53  0==stat(zDb, &sS
27c30 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
27c40 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
27c50 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
27c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
27c70 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27c80 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
27c90 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
27ca0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
27cb0 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
27cc0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
27cd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
27ce0 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
27cf0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
27d00 53 53 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 72 65  SSIONS;.  }.  re
27d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27d20 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
27d30 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
27d40 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
27d50 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
27d60 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
27d70 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
27d80 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
27d90 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
27da0 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
27db0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
27dc0 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
27dd0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
27de0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
27df0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
27e00 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
27e10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
27e20 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
27e30 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
27e40 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
27e50 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
27e60 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
27e70 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
27e80 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
27e90 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
27ea0 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
27eb0 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
27ec0 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
27ed0 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
27ee0 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
27ef0 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
27f00 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
27f10 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
27f20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
27f30 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
27f40 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
27f50 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
27f60 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
27f70 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
27f80 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
27f90 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
27fa0 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
27fb0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
27fc0 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
27fd0 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
27fe0 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
27ff0 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
28000 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
28010 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28020 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
28030 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
28040 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
28050 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
28060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
28070 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
28080 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
28090 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
280a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
280b0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
280c0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
280d0 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
280e0 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
280f0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
28100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
28110 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
28120 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
28130 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
28140 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
28150 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
28160 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
28170 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
28180 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
28190 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
281a0 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
281d0 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
281e0 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
281f0 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  t dirfd = -1;   
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28210 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  Directory file d
28220 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
28230 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
28240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28250 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
28260 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
28270 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
28280 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
28290 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
282a0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
282b0 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
282c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
282d0 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
282e0 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
282f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28300 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
28310 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
28320 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69 6e  rn Code */..  in
28330 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
28340 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28350 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
28360 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
28370 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
28380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
28390 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
283a0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
283b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
283c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
283d0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
283e0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
283f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
28400 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
28410 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
28420 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
28430 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
28440 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28450 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
28460 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
28470 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
28480 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
28490 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
284a0 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
284b0 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
284c0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
284d0 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
284e0 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
284f0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
28500 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
28510 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
28520 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
28530 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
28540 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
28550 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
28560 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
28570 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  )d..  */.  int i
28580 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 3d  sOpenDirectory =
28590 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
285a0 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
285b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
285c0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
285d0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
285e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
285f0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
28600 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
28610 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
28620 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
28630 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
28640 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
28650 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
28660 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
28670 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
28680 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
28690 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
286a0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
286b0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
286c0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
286d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
286e0 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
286f0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
28700 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
28710 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
28720 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
28730 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
28740 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
28750 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
28760 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
28770 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
28780 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
28790 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
287a0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
287b0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
287c0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
287d0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
287e0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
287f0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
28800 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
28810 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
28820 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
28830 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
28840 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
28850 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
28860 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
28870 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
28880 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
28890 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
288a0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
288b0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
288c0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
288d0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
288e0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
288f0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
28900 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
28910 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
28920 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
28930 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
28940 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
28950 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
28960 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
28970 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
28980 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
28990 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
289a0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
289b0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
289c0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
289d0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
289e0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
289f0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
28a00 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
28a10 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
28a20 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
28a30 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28a40 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
28a50 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
28a60 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
28a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
28a80 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
28a90 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
28aa0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
28ab0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
28ac0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
28ad0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
28ae0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
28af0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
28b00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
28b10 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
28b20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28b30 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
28b40 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28b50 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
28b60 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
28b70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28b80 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
28b90 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28ba0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
28bb0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
28bc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28bd0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
28be0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
28bf0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
28c00 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
28c10 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
28c20 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
28c30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
28c40 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
28c50 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
28c60 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
28c70 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
28c80 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
28c90 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
28ca0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
28cb0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
28cc0 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
28cd0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28ce0 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
28cf0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
28d00 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
28d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28d20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
28d30 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
28d40 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
28d50 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
28d60 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
28d70 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
28d80 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
28d90 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
28da0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
28db0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
28dc0 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
28dd0 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  ory);.    rc = u
28de0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
28df0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a  AX_PATHNAME+1, z
28e00 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
28e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28e20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28e30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
28e40 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
28e50 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
28e60 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
28e70 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
28e80 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
28e90 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
28ea0 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
28eb0 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
28ec0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
28ed0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
28ee0 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
28ef0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
28f00 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
28f10 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
28f20 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
28f30 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
28f40 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
28f50 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
28f60 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
28f70 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
28f80 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
28f90 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
28fa0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
28fb0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
28fc0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
28fd0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
28fe0 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
28ff0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
29000 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
29010 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
29020 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
29030 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
29040 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
29050 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
29060 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
29070 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
29080 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
29090 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
290a0 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
290b0 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
290c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
290d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
290e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55    assert( !p->pU
290f0 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61  nused );.      a
29100 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
29110 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c  LITE_OPEN_WAL ||
29120 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29130 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
29140 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
29150 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
29160 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
29170 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
29180 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
29190 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58   OSTRACE(("OPENX
291a0 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e     %-3d %s 0%o\n
291b0 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70  ", fd, zName, op
291c0 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69  enFlags));.    i
291d0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
291e0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
291f0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
29200 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
29210 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
29220 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
29230 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
29240 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
29250 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
29260 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
29270 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
29280 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
29290 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
292a0 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
292b0 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
292c0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
292d0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
292e0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
292f0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  _RDONLY;.      i
29300 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
29310 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
29320 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
29330 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
29340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29350 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72   fd<0 ){.      r
29360 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
29370 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
29380 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
29390 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
293a0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
293b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
293c0 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
293d0 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
293e0 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
293f0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
29400 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29  if( p->pUnused )
29410 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  {.    p->pUnused
29420 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70  ->fd = fd;.    p
29430 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  ->pUnused->flags
29440 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
29450 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
29460 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
29470 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
29480 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 6e 6c  e;.#else.    unl
29490 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64  ink(zName);.#end
294a0 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  if.  }.#if SQLIT
294b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
294c0 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20  _STYLE.  else{. 
294d0 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20     p->openFlags 
294e0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d  = openFlags;.  }
294f0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
29500 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 29  sOpenDirectory )
29510 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
29520 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
29530 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28  &dirfd);.    if(
29540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29550 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
29560 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 20 66   safe to close f
29570 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
29580 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 67   because it is g
29590 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 0a 20 20  uaranteed not.  
295a0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 6f 70 65      ** to be ope
295b0 6e 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  n on a database 
295c0 66 69 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65  file. If it were
295d0 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61 62   open on a datab
295e0 61 73 65 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  ase file,.      
295f0 2a 2a 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ** it would not 
29600 62 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  be safe to close
29610 20 61 73 20 74 68 69 73 20 77 6f 75 6c 64 20 72   as this would r
29620 65 6c 65 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  elease any locks
29630 20 68 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6f   held.      ** o
29640 6e 20 74 68 65 20 66 69 6c 65 20 62 79 20 74 68  n the file by th
29650 69 73 20 70 72 6f 63 65 73 73 2e 20 20 2a 2f 0a  is process.  */.
29660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
29670 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
29680 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20  _MAIN_DB );.    
29690 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
296a0 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
296b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
296c0 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
296d0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44 5f  .  }..#ifdef FD_
296e0 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63 6e 74  CLOEXEC.  osFcnt
296f0 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
29700 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
29710 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
29720 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  XEC);.#endif..  
29730 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
29740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
29750 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
29760 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29770 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
29780 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
29790 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
297a0 73 49 6e 66 6f 3b 0a 20 20 69 66 28 20 66 73 74  sInfo;.  if( fst
297b0 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
297c0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28  ) == -1 ){.    (
297d0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
297e0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
297f0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 64 69  rrno;.    if( di
29800 72 66 64 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  rfd>=0 ) robust_
29810 63 6c 6f 73 65 28 70 2c 20 64 69 72 66 64 2c 20  close(p, dirfd, 
29820 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
29830 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
29840 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
29850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29860 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
29870 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
29880 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
29890 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
298a0 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
298b0 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
298c0 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
298d0 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
298e0 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  DOS;.  }.#endif.
298f0 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e    .#if SQLITE_EN
29900 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29910 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52  LE.#if SQLITE_PR
29920 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
29930 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79  NG.  isAutoProxy
29940 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 1;.#endif.  i
29950 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
29960 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
29970 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
29980 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
29990 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
299a0 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
299b0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
299c0 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
299d0 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
299e0 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
299f0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
29a00 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
29a10 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
29a20 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
29a30 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
29a40 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
29a50 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
29a60 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
29a70 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
29a80 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
29a90 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
29aa0 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
29ab0 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
29ac0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
29ad0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  tfs fsInfo;.    
29ae0 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61    if( statfs(zPa
29af0 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  th, &fsInfo) == 
29b00 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -1 ){.        /*
29b10 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
29b20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20 69  close(fd) call i
29b30 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20 49  s sub-optimal. I
29b40 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
29b50 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  d.        ** wit
29b60 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62 61  h fd is a databa
29b70 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  se file, and the
29b80 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f 6e  re are other con
29b90 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20 20  nections open.  
29ba0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61 74        ** on that
29bb0 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 63   file that are c
29bc0 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e 67  urrently holding
29bd0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
29be0 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20 2a  on it,.        *
29bf0 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20  * then the call 
29c00 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c 20  to close() will 
29c10 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f 63  cancel those loc
29c20 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65 2c  ks. In practice,
29c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27 72  .        ** we'r
29c40 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  e assuming that 
29c50 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27 74  statfs() doesn't
29c60 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65 6e   fail very often
29c70 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20 20  . At least.     
29c80 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65 20     ** not while 
29c90 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
29ca0 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62 79  iptors opened by
29cb0 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
29cc0 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s on.        ** 
29cd0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61 72  the same file ar
29ce0 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a 20  e working.  */. 
29cf0 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45 72         p->lastEr
29d00 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
29d10 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d       if( dirfd>=
29d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
29d30 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 64  obust_close(p, d
29d40 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
29d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29d60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
29d70 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p, fd, __LINE__)
29d80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
29d90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
29da0 53 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  SS;.        goto
29db0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
29dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73        }.      us
29dd0 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66  eProxy = !(fsInf
29de0 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f  o.f_flags&MNT_LO
29df0 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CAL);.    }.    
29e00 69 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a  if( useProxy ){.
29e10 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
29e20 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
29e30 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
29e40 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
29e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29e60 20 20 20 20 20 20 20 20 20 20 20 69 73 44 65 6c             isDel
29e70 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29  ete, isReadonly)
29e80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29ea0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
29eb0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
29ec0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
29ed0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
29ee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29f00 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
29f10 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
29f20 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
29f30 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
29f40 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
29f50 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
29f60 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
29f70 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
29f80 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
29f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
29fa0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
29fb0 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
29fc0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
29fd0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
29fe0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29ff0 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
2a000 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
2a010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a020 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a030 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2a040 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
2a050 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
2a060 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
2a070 28 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  (pVfs, fd, dirfd
2a080 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
2a090 6e 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  noLock,.        
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2a0b0 44 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e  Delete, isReadon
2a0c0 6c 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  ly);.open_finish
2a0d0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
2a0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2a0f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
2a100 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
2a110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2a120 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
2a130 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
2a140 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
2a150 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
2a160 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
2a170 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
2a180 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
2a190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a1a0 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
2a1b0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2a1c0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
2a1d0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
2a1e0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
2a1f0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2a200 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2a210 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
2a220 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
2a230 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
2a240 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a250 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
2a260 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
2a270 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
2a280 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2a290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a2a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a2b0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
2a2c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
2a2d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a2e0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
2a2f0 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  unlink(zPath)==(
2a300 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  -1) && errno!=EN
2a310 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74 75  OENT ){.    retu
2a320 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
2a330 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a340 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a  ETE, "unlink", z
2a350 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Path);.  }.#ifnd
2a360 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2a370 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
2a380 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  dirSync ){.    i
2a390 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
2a3a0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
2a3b0 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
2a3c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a3d0 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2a3e0 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
2a3f0 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
2a400 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
2a410 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
2a420 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2a430 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2a440 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2a450 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
2a460 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
2a470 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
2a480 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2a490 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
2a4a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2a4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2a4c0 65 73 74 20 74 68 65 20 65 78 69 73 74 61 6e 63  est the existanc
2a4d0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
2a4e0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
2a4f0 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
2a500 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
2a510 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
2a520 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
2a530 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2a540 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
2a550 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2a560 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
2a570 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2a580 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
2a590 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
2a5a0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
2a5b0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
2a5c0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
2a5d0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
2a5e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
2a5f0 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
2a600 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
2a610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a620 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
2a630 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2a640 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
2a650 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
2a660 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
2a670 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a680 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
2a690 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
2a6a0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
2a6b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2a6c0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
2a6d0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
2a6e0 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
2a6f0 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
2a700 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
2a710 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2a720 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
2a730 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2a740 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55  amode = 0;.  UNU
2a750 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
2a760 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
2a770 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2a780 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
2a790 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74  CCESS; );.  swit
2a7a0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
2a7b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2a7c0 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
2a7d0 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a    amode = F_OK;.
2a7e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a7f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
2a800 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
2a810 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f       amode = W_O
2a820 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  K|R_OK;.      br
2a830 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
2a840 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
2a850 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
2a860 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2a870 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
2a880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
2a890 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
2a8a0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
2a8b0 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63  *pResOut = (osAc
2a8c0 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64  cess(zPath, amod
2a8d0 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c  e)==0);.  if( fl
2a8e0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
2a8f0 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52  SS_EXISTS && *pR
2a900 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72  esOut ){.    str
2a910 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2a920 20 20 69 66 28 20 30 3d 3d 73 74 61 74 28 7a 50    if( 0==stat(zP
2a930 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
2a940 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
2a950 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
2a960 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2a970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a980 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
2a990 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2a9a0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
2a9b0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
2a9c0 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
2a9d0 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
2a9e0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
2a9f0 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
2aa00 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
2aa10 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
2aa20 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
2aa30 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
2aa40 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
2aa50 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
2aa60 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
2aa70 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
2aa80 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
2aa90 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
2aaa0 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
2aab0 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
2aac0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
2aad0 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
2aae0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2aaf0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2ab00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2ab10 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2ab20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ab30 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2ab40 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2ab50 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
2ab60 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
2ab70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2ab80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2ab90 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
2aba0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
2abb0 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2abd0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
2abe0 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
2abf0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2ac00 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2ac10 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2ac20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2ac30 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2ac40 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2ac50 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2ac60 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2ac70 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2ac80 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
2ac90 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
2aca0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
2acb0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
2acc0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
2acd0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
2ace0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
2acf0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2ad00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2ad10 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
2ad20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2ad30 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
2ad40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2ad50 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
2ad60 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
2ad70 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
2ad80 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
2ad90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2ada0 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
2adb0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
2adc0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
2add0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
2ade0 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
2adf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2ae00 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
2ae10 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2ae20 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
2ae30 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
2ae40 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
2ae50 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
2ae60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ae70 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
2ae80 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
2ae90 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
2aea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aeb0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2aec0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2aed0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
2aee0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
2aef0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
2af00 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
2af10 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
2af20 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
2af30 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
2af40 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
2af50 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
2af60 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
2af70 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
2af80 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
2af90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
2afa0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2afb0 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
2afc0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2afd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
2afe0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
2aff0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
2b000 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
2b010 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2b020 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
2b030 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
2b040 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
2b050 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
2b060 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
2b070 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
2b080 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
2b090 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
2b0a0 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
2b0b0 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
2b0c0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
2b0d0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
2b0e0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
2b0f0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
2b100 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
2b110 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
2b120 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
2b130 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
2b140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
2b150 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
2b160 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2b170 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2b180 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
2b190 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
2b1a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b1b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
2b1c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2b1d0 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
2b1e0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
2b1f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2b200 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
2b210 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
2b220 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
2b230 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
2b240 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
2b250 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2b260 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
2b270 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
2b280 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
2b290 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
2b2a0 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
2b2b0 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
2b2c0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
2b2d0 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
2b2e0 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
2b2f0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2b300 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
2b310 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
2b320 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
2b330 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
2b340 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
2b350 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2b360 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
2b370 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
2b380 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
2b390 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
2b3a0 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
2b3b0 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
2b3c0 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
2b3d0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
2b3e0 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
2b3f0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
2b400 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
2b410 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
2b420 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2b430 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
2b440 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
2b450 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
2b460 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
2b470 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
2b480 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
2b490 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
2b4a0 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
2b4b0 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
2b4c0 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
2b4d0 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
2b4e0 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
2b4f0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
2b500 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
2b510 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
2b520 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
2b530 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
2b540 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
2b550 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
2b560 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
2b570 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
2b580 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
2b590 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
2b5a0 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
2b5b0 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
2b5c0 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
2b5d0 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
2b5e0 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
2b5f0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
2b600 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
2b610 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2b620 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
2b630 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
2b640 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2b650 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
2b660 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
2b670 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
2b680 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
2b690 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2b6a0 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
2b6b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b6c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2b6d0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
2b6e0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2b6f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2b700 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2b710 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2b720 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
2b730 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2b740 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2b750 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
2b760 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2b770 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2b780 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
2b790 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
2b7a0 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
2b7b0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
2b7c0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2b7d0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
2b7e0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
2b7f0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2b800 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2b810 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b820 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
2b830 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
2b840 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
2b850 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
2b860 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
2b870 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
2b880 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
2b890 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
2b8a0 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
2b8b0 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
2b8c0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
2b8d0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
2b8e0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
2b8f0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
2b900 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
2b910 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
2b920 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
2b930 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
2b940 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
2b950 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
2b960 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
2b970 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
2b980 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
2b990 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
2b9a0 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
2b9b0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
2b9c0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
2b9d0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
2b9e0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
2b9f0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
2ba00 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
2ba10 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
2ba20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2ba30 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
2ba40 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
2ba50 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
2ba60 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
2ba70 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
2ba80 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
2ba90 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
2baa0 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
2bab0 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
2bac0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
2bad0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
2bae0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2baf0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2bb00 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
2bb10 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
2bb20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2bb30 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
2bb40 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
2bb50 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2bb60 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
2bb70 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
2bb80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
2bb90 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
2bba0 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
2bbb0 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
2bbc0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
2bbd0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
2bbe0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
2bbf0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2bc00 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
2bc10 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
2bc20 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
2bc30 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
2bc40 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
2bc50 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66  {.      do{ nBuf
2bc60 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
2bc70 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
2bc80 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72  e( nBuf<0 && err
2bc90 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
2bca0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2bcb0 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2bcc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2bcd0 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
2bce0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2bcf0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2bd00 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2bd10 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2bd20 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
2bd30 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
2bd40 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2bd50 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
2bd60 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
2bd70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2bd80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2bd90 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
2bda0 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
2bdb0 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2bdc0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
2bdd0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
2bde0 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
2bdf0 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
2be00 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2be10 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
2be20 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
2be30 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
2be40 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2be50 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
2be60 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2be70 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
2be80 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
2be90 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2bea0 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
2beb0 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
2bec0 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
2bed0 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
2bee0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
2bef0 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
2bf00 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
2bf10 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
2bf20 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2bf30 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2bf40 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2bf50 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
2bf60 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
2bf70 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
2bf80 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
2bf90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2bfa0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2bfb0 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2bfc0 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
2bfd0 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
2bfe0 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
2bff0 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
2c000 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2c010 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2c020 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2c030 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
2c040 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2c050 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2c060 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2c070 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2c080 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2c090 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2c0a0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2c0b0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2c0c0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2c0d0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2c0e0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2c0f0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2c100 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2c110 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2c120 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2c130 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2c140 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2c150 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2c160 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2c170 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2c180 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2c190 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2c1a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2c1b0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2c1c0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2c1d0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2c1e0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2c1f0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2c200 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2c210 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2c220 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2c230 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2c240 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2c250 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2c260 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2c270 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2c280 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2c290 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2c2a0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2c2b0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2c2c0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2c2d0 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
2c2e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2c2f0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2c300 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2c310 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2c320 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2c330 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2c340 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
2c350 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2c360 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c370 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
2c380 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
2c390 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2c3a0 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69  640000;.#if defi
2c3b0 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
2c3c0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
2c3d0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
2c3e0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
2c3f0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
2c400 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
2c410 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2c420 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
2c430 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
2c440 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
2c450 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
2c460 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2c470 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2c480 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2c490 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
2c4a0 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
2c4b0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
2c4c0 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64  ow;.  gettimeofd
2c4d0 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20  ay(&sNow, 0);.  
2c4e0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
2c4f0 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
2c500 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
2c510 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
2c520 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
2c530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2c540 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2c550 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2c560 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2c570 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2c580 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2c590 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2c5a0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2c5b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2c5c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2c5d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2c5e0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2c5f0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2c600 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2c610 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2c620 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
2c630 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2c640 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2c650 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
2c660 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
2c670 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2c680 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2c690 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2c6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c6b0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
2c6c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2c6d0 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
2c6e0 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
2c6f0 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53 45  int64 i;.  UNUSE
2c700 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c710 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72 72  sed);.  unixCurr
2c720 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
2c730 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
2c740 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2c750 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2c760 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
2c770 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
2c780 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
2c790 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
2c7a0 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
2c7b0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
2c7c0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
2c7d0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
2c7e0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
2c7f0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
2c800 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
2c810 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
2c820 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
2c830 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
2c840 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
2c850 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2c860 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
2c870 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
2c880 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
2c890 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
2c8a0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
2c8b0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2c8c0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2c8d0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
2c8e0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
2c8f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2c900 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
2c910 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c920 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
2c930 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2c940 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
2c950 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
2c960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c970 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
2c980 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2c990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c9a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2c9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c9f0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
2ca00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca60 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
2ca70 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
2ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
2caa0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2cab0 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
2cac0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
2cad0 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
2cae0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
2caf0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2cb00 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
2cb10 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
2cb20 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
2cb30 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
2cb40 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
2cb50 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
2cb60 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
2cb70 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
2cb80 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2cb90 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
2cba0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
2cbb0 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
2cbc0 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
2cbd0 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
2cbe0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
2cbf0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
2cc00 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
2cc10 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
2cc20 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2cc30 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
2cc40 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
2cc50 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
2cc60 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
2cc70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
2cc80 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
2cc90 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
2cca0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
2ccb0 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
2ccc0 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
2ccd0 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
2cce0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2ccf0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
2cd00 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
2cd10 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
2cd20 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
2cd30 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
2cd40 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
2cd50 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
2cd60 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
2cd70 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
2cd80 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
2cd90 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
2cda0 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
2cdb0 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
2cdc0 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
2cdd0 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
2cde0 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
2cdf0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
2ce00 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
2ce10 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
2ce20 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
2ce30 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
2ce40 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
2ce50 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
2ce60 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
2ce70 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
2ce80 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
2ce90 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
2cea0 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
2ceb0 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
2cec0 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
2ced0 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
2cee0 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
2cef0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2cf00 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2cf10 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2cf20 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
2cf30 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2cf40 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
2cf50 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
2cf60 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
2cf70 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
2cf80 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20  000..   ..**    
2cf90 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
2cfa0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
2cfb0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
2cfc0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
2cfd0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
2cfe0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
2cff0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
2d000 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2d010 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
2d020 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
2d030 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
2d040 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
2d050 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
2d060 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
2d070 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
2d080 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
2d090 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2d0a0 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
2d0b0 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
2d0c0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
2d0d0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2d0e0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
2d0f0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
2d100 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
2d110 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
2d120 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
2d130 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
2d140 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
2d150 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
2d160 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
2d170 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
2d180 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
2d190 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
2d1a0 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
2d1b0 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
2d1c0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
2d1d0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
2d1e0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
2d1f0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
2d200 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
2d210 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
2d220 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
2d230 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
2d240 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
2d250 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
2d260 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
2d270 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
2d280 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
2d290 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
2d2a0 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
2d2b0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
2d2c0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
2d2d0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
2d2e0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
2d2f0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
2d300 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
2d310 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
2d320 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
2d330 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
2d340 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
2d350 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
2d360 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
2d370 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
2d380 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
2d390 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
2d3a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2d3b0 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
2d3c0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2d3d0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2d3e0 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
2d3f0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d410 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
2d420 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
2d430 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2d440 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2d450 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
2d460 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
2d470 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
2d480 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
2d490 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
2d4a0 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2d4b0 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
2d4c0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
2d4d0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
2d4e0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
2d4f0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
2d500 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
2d510 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
2d520 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
2d530 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
2d540 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
2d550 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
2d560 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
2d570 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2d580 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
2d590 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
2d5a0 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
2d5b0 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
2d5c0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
2d5d0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
2d5e0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
2d5f0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
2d600 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
2d610 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
2d620 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
2d630 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
2d640 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
2d650 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
2d660 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2d670 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
2d680 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
2d690 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
2d6a0 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
2d6b0 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
2d6c0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
2d6d0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
2d6e0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
2d6f0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
2d700 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
2d710 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
2d720 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
2d730 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
2d740 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
2d750 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
2d760 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2d770 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
2d780 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
2d790 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
2d7a0 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
2d7b0 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
2d7c0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
2d7d0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
2d7e0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
2d7f0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
2d800 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2d810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2d820 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
2d830 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
2d840 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
2d850 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
2d860 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
2d870 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
2d880 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
2d890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d8a0 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
2d8b0 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
2d8c0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
2d8d0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
2d8e0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
2d8f0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
2d900 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
2d910 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
2d920 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
2d930 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
2d940 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
2d950 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
2d960 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
2d970 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
2d980 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
2d990 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
2d9a0 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
2d9b0 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
2d9c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
2d9d0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
2d9e0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
2d9f0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
2da00 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
2da10 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
2da20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
2da30 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
2da40 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2da50 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
2da60 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
2da70 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
2da80 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
2da90 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
2daa0 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
2dab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dac0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
2dad0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
2dae0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
2daf0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
2db00 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
2db10 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
2db20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
2db30 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
2db40 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
2db50 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
2db60 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
2db70 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
2db80 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
2db90 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
2dba0 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
2dbb0 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
2dbc0 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
2dbd0 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
2dbe0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
2dbf0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
2dc00 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
2dc10 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
2dc20 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
2dc30 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
2dc40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
2dc50 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
2dc60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2dc70 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
2dc80 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
2dc90 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
2dca0 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
2dcb0 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
2dcc0 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
2dcd0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2dce0 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
2dcf0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
2dd00 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
2dd10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2dd20 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
2dd30 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
2dd40 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
2dd50 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
2dd60 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
2dd70 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
2dd80 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
2dd90 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
2dda0 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
2ddb0 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
2ddc0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
2ddd0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
2dde0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
2ddf0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
2de00 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
2de10 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2de20 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
2de30 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
2de40 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
2de50 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
2de60 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
2de70 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
2de80 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
2de90 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
2dea0 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
2deb0 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
2dec0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
2ded0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
2dee0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
2def0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
2df00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
2df10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2df20 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
2df30 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
2df40 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
2df50 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
2df60 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
2df70 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
2df80 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
2df90 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
2dfa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
2dfb0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
2dfc0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2dfd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
2dfe0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2dff0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
2e000 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
2e010 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
2e020 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
2e030 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
2e040 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
2e050 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
2e060 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
2e070 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
2e080 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
2e090 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
2e0a0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
2e0b0 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
2e0c0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
2e0d0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
2e0e0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
2e0f0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
2e100 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
2e110 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
2e120 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2e130 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
2e140 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
2e150 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
2e160 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
2e170 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
2e180 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
2e190 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
2e1a0 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2e1b0 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
2e1c0 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
2e1d0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2e1e0 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
2e1f0 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
2e200 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
2e210 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2e220 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
2e230 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
2e240 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
2e250 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
2e260 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
2e270 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
2e280 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
2e290 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
2e2a0 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
2e2b0 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
2e2c0 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
2e2d0 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
2e2e0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
2e2f0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2e300 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
2e310 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
2e320 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
2e330 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2e340 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
2e350 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
2e360 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
2e370 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
2e380 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
2e390 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
2e3a0 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
2e3b0 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
2e3c0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
2e3d0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2e3e0 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
2e3f0 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
2e400 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
2e410 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
2e420 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
2e430 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
2e440 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
2e450 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2e460 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
2e470 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
2e480 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
2e490 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
2e4a0 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
2e4b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2e4c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2e4d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
2e4e0 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
2e4f0 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
2e500 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
2e510 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
2e520 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
2e530 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
2e540 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
2e550 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
2e560 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2e570 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2e580 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
2e590 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2e5a0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
2e5b0 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2e5c0 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
2e5d0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2e5e0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
2e5f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2e600 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2e610 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2e620 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
2e630 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
2e640 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2e650 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
2e660 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
2e670 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
2e680 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
2e690 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e6b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
2e6c0 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
2e6d0 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
2e6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
2e6f0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
2e700 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
2e710 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
2e720 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
2e730 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2e740 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
2e750 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
2e760 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
2e770 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
2e780 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
2e790 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
2e7a0 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
2e7b0 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
2e7c0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2e7d0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
2e7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
2e7f0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
2e800 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
2e810 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
2e820 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
2e830 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
2e840 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
2e850 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
2e860 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
2e870 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2e880 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
2e890 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
2e8a0 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
2e8b0 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
2e8c0 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
2e8d0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
2e8e0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
2e8f0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
2e900 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
2e910 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
2e920 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
2e930 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2e940 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
2e950 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
2e960 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2e970 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
2e980 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
2e990 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2e9a0 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
2e9b0 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
2e9c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2e9d0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
2e9e0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2e9f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ea00 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2ea10 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
2ea20 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
2ea30 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
2ea40 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
2ea50 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
2ea60 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
2ea70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
2ea80 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
2ea90 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
2eaa0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
2eab0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
2eac0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
2ead0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
2eae0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
2eaf0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
2eb00 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
2eb10 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2eb20 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
2eb30 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
2eb40 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
2eb50 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
2eb60 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
2eb70 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
2eb80 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
2eb90 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
2eba0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
2ebb0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
2ebc0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
2ebd0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
2ebe0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
2ebf0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2ec00 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
2ec10 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2ec20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec30 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
2ec40 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
2ec50 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
2ec60 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
2ec70 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
2ec80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ec90 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2eca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
2ecb0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
2ecc0 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
2ecd0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2ece0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
2ecf0 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
2ed00 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
2ed10 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
2ed20 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
2ed30 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
2ed40 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
2ed50 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
2ed60 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
2ed70 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
2ed80 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
2ed90 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
2eda0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
2edb0 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
2edc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
2edd0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
2ede0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
2edf0 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
2ee00 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
2ee10 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
2ee20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2ee30 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
2ee40 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
2ee50 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
2ee60 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
2ee70 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
2ee80 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
2ee90 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
2eea0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
2eeb0 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20   if( mkdir(buf, 
2eec0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2eed0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
2eee0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
2eef0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2ef00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2ef10 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
2ef20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
2ef30 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
2ef40 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
2ef50 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
2ef80 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2ef90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2efa0 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
2efb0 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
2efc0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2efd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2efe0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
2eff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f010 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
2f020 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
2f030 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
2f040 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
2f050 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
2f060 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2f070 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
2f080 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2f090 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2f0a0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2f0b0 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
2f0c0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
2f0d0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2f0e0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
2f0f0 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
2f100 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
2f110 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
2f120 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
2f130 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2f140 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
2f150 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
2f160 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
2f170 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
2f180 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
2f190 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
2f1a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
2f1b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2f1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2f1d0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2f1e0 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
2f1f0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
2f200 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
2f210 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
2f220 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
2f230 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
2f240 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
2f250 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
2f260 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
2f270 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
2f280 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
2f290 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
2f2a0 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2f2b0 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
2f2c0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66  = -1;.  int dirf
2f2d0 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
2f2e0 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
2f2f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f300 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2f310 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
2f320 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
2f330 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
2f340 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
2f350 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2f360 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
2f370 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
2f380 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
2f390 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
2f3a0 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
2f3b0 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
2f3c0 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
2f3d0 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
2f3e0 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
2f3f0 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
2f400 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
2f410 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
2f420 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
2f430 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
2f440 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
2f450 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
2f460 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
2f470 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
2f480 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2f490 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
2f4a0 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2f4b0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2f4c0 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
2f4d0 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
2f4e0 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
2f4f0 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
2f500 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2f510 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2f520 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
2f530 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
2f540 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2f560 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
2f570 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
2f580 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2f590 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2f5a0 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2f5b0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2f5c0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
2f5d0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
2f5e0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
2f5f0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
2f600 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
2f610 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
2f620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f630 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2f640 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2f650 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
2f660 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2f670 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NS);.      }.   
2f680 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
2f690 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
2f6a0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
2f6b0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f6c0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2f6d0 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2f6e0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2f6f0 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e  IONS);.    terrn
2f700 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20  o = errno;.  }. 
2f710 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2f720 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20   if( islockfile 
2f730 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f740 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2f750 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74   }.    switch (t
2f760 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63  errno) {.      c
2f770 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20  ase EACCES:.    
2f780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f790 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61  E_PERM;.      ca
2f7a0 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20  se EIO: .       
2f7b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f7c0 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76  OERR_LOCK; /* ev
2f7d0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2f7e0 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20  the conch */.   
2f7f0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2f800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f810 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2f820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
2f830 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2f840 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2f850 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  c(sizeof(*pNew))
2f860 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55  ;.  if( pNew==NU
2f870 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  LL ){.    rc = S
2f880 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f890 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65   goto end_create
2f8a0 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65  _proxy;.  }.  me
2f8b0 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
2f8c0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2f8d0 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61  .  pNew->openFla
2f8e0 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
2f8f0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56    memset(&dummyV
2f900 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  fs, 0, sizeof(du
2f910 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d  mmyVfs));.  dumm
2f920 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20  yVfs.pAppData = 
2f930 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2f940 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d  IoFinder;.  dumm
2f950 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75  yVfs.zName = "du
2f960 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d  mmy";.  pUnused-
2f970 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75  >fd = fd;.  pUnu
2f980 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65  sed->flags = ope
2f990 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  nFlags;.  pNew->
2f9a0 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2f9b0 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  d;.  .  rc = fil
2f9c0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d  lInUnixFile(&dum
2f9d0 6d 79 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64  myVfs, fd, dirfd
2f9e0 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
2f9f0 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20  )pNew, path, 0, 
2fa00 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
2fa10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fa20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
2fa30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2fa40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
2fa50 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
2fa60 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
2fa70 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
2fa80 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
2fa90 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
2faa0 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
2fab0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
2fac0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2fad0 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
2fae0 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
2faf0 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
2fb00 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
2fb10 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
2fb20 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2fb30 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
2fb40 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
2fb50 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
2fb60 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
2fb70 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f   id length */../
2fb80 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
2fb90 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
2fba0 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
2fbb0 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
2fbc0 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
2fbd0 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
2fbe0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2fbf0 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74   *wait);../* get
2fc00 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61   the host ID via
2fc10 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20   gethostuuid(), 
2fc20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69  pHostID must poi
2fc30 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54  nt to PROXY_HOST
2fc40 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20  IDLEN .** bytes 
2fc50 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  of writable memo
2fc60 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
2fc70 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
2fc80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
2fc90 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
2fca0 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rror){.  assert(
2fcb0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2fcc0 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
2fcd0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
2fce0 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
2fcf0 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64  OSTIDLEN);.#if d
2fd00 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f  efined(__MAX_OS_
2fd10 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
2fd20 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20  QUIRED)\.       
2fd30 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43          && __MAC
2fd40 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
2fd50 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a  N_REQUIRED<1050.
2fd60 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
2fd70 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
2fd80 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
2fd90 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
2fda0 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69  timeout */.    i
2fdb0 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70  f( gethostuuid(p
2fdc0 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74  HostID, &timeout
2fdd0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
2fde0 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
2fdf0 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
2fe00 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20          *pError 
2fe10 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  = err;.      }. 
2fe20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fe30 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
2fe40 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
2fe50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2fe60 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
2fe70 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
2fe80 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
2fe90 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
2fea0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2feb0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
2fec0 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
2fed0 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
2fee0 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
2fef0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2ff00 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
2ff10 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
2ff20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ff30 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
2ff40 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
2ff50 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
2ff60 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
2ff70 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
2ff80 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2ff90 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
2ffa0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
2ffb0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
2ffc0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
2ffd0 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
2ffe0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
2fff0 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
30000 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
30010 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
30020 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
30030 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
30040 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
30050 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
30060 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
30070 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
30080 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
30090 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
300a0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
300b0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
300c0 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
300d0 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
300e0 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
300f0 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
30100 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
30110 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
30120 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
30130 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
30140 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
30150 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
30160 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
30170 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
30180 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
30190 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
301a0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
301b0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
301c0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
301d0 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
301e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
301f0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
30200 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
30210 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
30220 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
30230 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
30240 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
30250 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
30260 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
30270 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
30280 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
30290 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
302a0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
302b0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
302c0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
302d0 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
302e0 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
302f0 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
30300 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
30310 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30320 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
30330 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
30340 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
30350 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
30360 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
30370 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
30380 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
30390 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
303a0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
303b0 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
303c0 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
303d0 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
303e0 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
303f0 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
30400 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
30410 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30420 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
30430 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
30440 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
30450 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
30460 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
30470 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
30480 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
30490 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50  .  readLen = osP
304a0 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
304b0 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
304c0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
304d0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
304e0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
304f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30500 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
30510 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
30520 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
30530 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
30540 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
30550 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
30560 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
30570 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
30580 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
30590 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
305a0 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
305b0 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a  _CREAT|O_EXCL),.
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305d0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
305e0 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
305f0 4e 53 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  NS);.  if( fd<0 
30600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
30610 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
30620 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
30630 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28  "create failed (
30640 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
30650 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
30660 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
30670 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66  osPwrite(fd, buf
30680 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d  , readLen, 0) !=
30690 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65   (ssize_t)readLe
306a0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
306b0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
306c0 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
306d0 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
306e0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
306f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
30700 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
30710 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
30720 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c  Path) ){.    sql
30730 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30740 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
30750 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61  rmsg, "rename fa
30760 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
30770 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
30780 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
30790 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69    rc = 0;.  fpri
307a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f  ntf(stderr, "bro
307b0 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ke stale lock on
307c0 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a   %s\n", cPath);.
307d0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
307e0 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  File, conchFile-
307f0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
30800 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20   conchFile->h = 
30810 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  fd;.  conchFile-
30820 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52  >openFlags = O_R
30830 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a  DWR | O_CREAT;..
30840 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20  end_breaklock:. 
30850 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
30860 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  f( fd>=0 ){.    
30870 20 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b    unlink(tPath);
30880 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
30890 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
308a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
308b0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
308c0 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
308d0 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
308e0 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
308f0 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
30900 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
30910 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
30920 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
30930 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
30940 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
30950 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
30960 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
30970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30980 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
30990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
309a0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
309b0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
309c0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
309d0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
309e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
309f0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
30a00 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
30a10 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
30a20 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
30a30 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
30a40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
30a50 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
30a60 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
30a70 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
30a80 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
30a90 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
30aa0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
30ab0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
30ac0 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
30ad0 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
30ae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30af0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
30b00 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
30b10 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
30b20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
30b30 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
30b40 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
30b50 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
30b60 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
30b70 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
30b80 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
30b90 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
30ba0 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
30bb0 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
30bc0 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
30bd0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
30be0 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
30bf0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
30c00 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
30c10 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
30c20 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
30c30 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
30c40 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
30c50 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
30c60 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
30c70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
30c80 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
30c90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30ca0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
30cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
30cc0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
30cd0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
30ce0 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
30cf0 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
30d00 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
30d10 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
30d20 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
30d30 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
30d40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
30d50 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
30d60 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
30d70 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
30d80 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
30d90 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
30da0 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
30db0 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
30dc0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
30dd0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
30de0 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
30df0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30e00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
30e10 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
30e20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
30e30 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
30e40 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
30e50 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
30e60 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
30e70 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
30e80 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
30e90 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
30ea0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
30eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
30ec0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
30ed0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
30ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30ef0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
30f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
30f10 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
30f20 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
30f30 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
30f40 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
30f50 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
30f60 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
30f70 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
30f80 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
30f90 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
30fa0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
30fb0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
30fc0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
30fd0 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
30fe0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30ff0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
31000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31020 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
31030 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
31040 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
31050 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
31060 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31070 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
31080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31090 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
310a0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
310b0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
310c0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
310d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
310e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
310f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
31100 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
31110 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
31120 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
31130 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
31140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31150 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
31160 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
31170 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
31180 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
31190 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
311a0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
311b0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
311c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
311d0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
311e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
311f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31200 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31210 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
31220 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31230 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
31240 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
31250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
31260 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
31270 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
31280 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
31290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
312a0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
312b0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
312c0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
312d0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
312e0 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
312f0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
31300 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
31310 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
31320 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
31330 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
31340 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
31350 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
31360 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
31370 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
31380 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
31390 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
313a0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
313b0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
313c0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
313d0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
313e0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
313f0 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
31400 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
31410 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
31420 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
31430 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
31440 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
31450 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31460 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
31470 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
31480 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31490 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
314a0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
314b0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
314c0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
314d0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
314e0 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
314f0 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
31500 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
31510 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
31520 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
31530 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
31540 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
31550 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
31560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31570 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
31580 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
31590 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
315a0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
315b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
315c0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
315d0 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
315e0 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
315f0 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
31600 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
31610 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
31620 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
31640 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31650 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
31660 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
31670 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
31680 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
31690 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
316a0 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
316b0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
316c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
316d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
316e0 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
316f0 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
31700 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
31710 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
31720 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
31730 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
31740 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
31750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31760 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
31770 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
31780 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
31790 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
317a0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
317b0 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
317c0 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
317d0 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
317e0 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
317f0 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
31800 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
31810 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
31820 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
31830 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
31840 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
31850 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
31860 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
31870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
31880 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
31890 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
318a0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
318b0 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
318c0 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
318d0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
318e0 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
318f0 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
31900 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
31910 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
31920 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
31930 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
31940 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
31950 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
31960 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
31970 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
31980 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
31990 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
319a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
319b0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
319c0 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
319d0 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
319e0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
319f0 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
31a00 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
31a10 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
31a20 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
31a30 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
31a40 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
31a50 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
31a60 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
31a70 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
31a80 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
31a90 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
31aa0 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
31ab0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
31ac0 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
31ad0 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
31ae0 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
31af0 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
31b00 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
31b10 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
31b20 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
31b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
31b60 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
31b70 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
31b80 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
31b90 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
31ba0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
31bb0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
31bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
31bd0 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
31be0 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
31bf0 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
31c00 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
31c10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
31c20 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
31c30 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
31c40 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
31c50 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
31c60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
31c70 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
31c80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
31c90 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
31ca0 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
31cb0 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
31cc0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
31cd0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
31ce0 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
31cf0 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
31d00 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
31d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31d20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
31d30 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
31d40 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
31d50 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
31d60 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
31d70 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
31d80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
31d90 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
31da0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
31db0 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
31dc0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
31dd0 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
31de0 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
31df0 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
31e00 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
31e10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31e20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
31e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31e40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
31e50 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
31e60 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
31e70 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
31e80 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
31e90 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
31ea0 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
31ec0 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
31ed0 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
31ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
31ef0 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
31f00 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
31f10 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
31f20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
31f30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31f40 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
31f50 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
31f60 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
31f70 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
31f80 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
31f90 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
31fa0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
31fb0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
31fc0 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
31fd0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
31fe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31ff0 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
32000 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
32010 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
32020 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
32030 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
32040 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
32050 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
32060 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32070 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
32080 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
32090 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
320a0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
320b0 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
320c0 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
320d0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
320e0 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
320f0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
32100 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
32110 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
32120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
32130 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
32140 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
32150 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
32160 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
32170 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
32180 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
32190 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
321a0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
321b0 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
321c0 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
321d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
321e0 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
321f0 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
32200 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
32210 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
32220 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
32230 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
32240 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
32250 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
32260 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
32270 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
32280 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
32290 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
322a0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
322b0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
322c0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
322d0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
322e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
322f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32300 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32310 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
32320 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
32330 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
32340 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
32350 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
32360 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
32370 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32380 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
32390 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
323a0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
323b0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
323c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
323d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
323e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
323f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
32400 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
32410 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
32420 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
32430 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
32440 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
32450 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
32460 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
32470 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
32480 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
32490 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
324a0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
324b0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
324c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
324d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
324e0 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
324f0 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
32500 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32510 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
32520 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
32530 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
32540 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32550 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
32560 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32570 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
32580 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
32590 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
325a0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
325b0 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
325c0 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
325d0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
325e0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
325f0 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66          robust_f
32600 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
32610 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
32620 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32630 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
32640 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
32650 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
32660 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
32670 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
32680 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
32690 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
326a0 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
326b0 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
326c0 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
326d0 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
326e0 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
326f0 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
32700 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
32710 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
32720 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
32730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
32740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32750 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
32760 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
32770 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
32780 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
32790 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
327a0 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
327b0 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
327c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
327d0 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
327e0 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
327f0 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
32800 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
32840 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
32850 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
32860 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
32870 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
32880 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
32890 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
328a0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
328b0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
328c0 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
328d0 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23  le->h, cmode);.#
328e0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
328f0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
32900 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64     rc = osFchmod
32910 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
32920 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
32930 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
32940 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
32950 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
32960 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
32980 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
329a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
329b0 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
329c0 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
329d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329e0 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
329f0 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
32a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
32a10 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
32a20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
32a30 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
32a40 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
32a50 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
32a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
32a70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32a80 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
32a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
32aa0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
32ab0 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
32ac0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
32ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ae0 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
32af0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
32b00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
32b10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32b20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
32b30 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
32b40 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
32b50 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
32b60 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
32b70 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
32b80 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
32b90 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
32ba0 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
32bb0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
32bc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32bd0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
32be0 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
32bf0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
32c00 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
32c10 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
32c20 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
32c30 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
32c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
32c50 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
32c60 20 20 20 20 69 6e 74 20 66 64 20 3d 20 72 6f 62      int fd = rob
32c70 75 73 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64  ust_open(pCtx->d
32c80 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70  bPath, pFile->op
32c90 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  enFlags,.       
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
32cb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
32cc0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
32cd0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
32ce0 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f  (("TRANSPROXY: O
32cf0 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29  PEN  %d\n", fd))
32d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64  ;.        if( fd
32d10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
32d20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a   pFile->h = fd;.
32d30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32d40 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49           rc=SQLI
32d50 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
32d60 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ; /* SQLITE_BUSY
32d70 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  ? proxyTakeConch
32d80 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20   called.        
32d90 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e     during lockin
32da0 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  g */.        }. 
32db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32dc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
32dd0 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  & !pCtx->lockPro
32de0 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  xy ){.        ch
32df0 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c  ar *path = tempL
32e00 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f  ockPath ? tempLo
32e10 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c  ckPath : pCtx->l
32e20 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
32e30 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
32e40 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70  CreateUnixFile(p
32e50 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b  ath, &pCtx->lock
32e60 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20  Proxy, 1);.     
32e70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32e80 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
32e90 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f  TE_NOMEM && tryO
32ea0 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ldLockPath ){.  
32eb0 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f          /* we co
32ec0 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68  uldn't create th
32ed0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
32ee0 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c  e with the old l
32ef0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20  ock file path.  
32f00 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
32f10 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74  ry again via aut
32f20 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20  o-naming .      
32f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32f40 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61    forceNewLockPa
32f50 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
32f60 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68    tryOldLockPath
32f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32f80 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20  continue; /* go 
32f90 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b  back to the do {
32fa0 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f  } while start po
32fb0 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a  int, try again *
32fc0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
32fd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
32fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32ff0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
33000 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
33010 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72   path if we extr
33020 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a  acted the value.
33030 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
33040 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
33050 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20  or the path was 
33060 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
33070 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20   stack.         
33080 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  */.        if( t
33090 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  empLockPath ){. 
330a0 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c           pCtx->l
330b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73  ockProxyPath = s
330c0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
330d0 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b  , tempLockPath);
330e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
330f0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
33100 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
33110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
33120 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
33130 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33140 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33160 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e         pCtx->con
33170 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  chHeld = 1;.    
33180 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28      .        if(
33190 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
331a0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
331b0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
331c0 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69          afpLocki
331d0 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74  ngContext *afpCt
331e0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  x;.          afp
331f0 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  Ctx = (afpLockin
33200 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d  gContext *)pCtx-
33210 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b  >lockProxy->lock
33220 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
33230 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62        afpCtx->db
33240 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  Path = pCtx->loc
33250 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
33260 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
33270 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
33280 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
33290 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
332a0 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
332b0 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  e, NO_LOCK);.   
332c0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
332d0 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
332e0 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
332f0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
33300 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
33310 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65  E_OK?"ok":"faile
33320 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  d"));.      retu
33330 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69  rn rc;.    } whi
33340 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61  le (1); /* in ca
33350 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  se we need to re
33360 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c  try the :auto: l
33370 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20  ock file - .    
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
33390 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  we should never 
333a0 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20  get here except 
333b0 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75  via the 'continu
333c0 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a  e' call. */.  }.
333d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c  }../*.** If pFil
333e0 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f  e holds a lock o
333f0 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  n a conch file, 
33400 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61  then release tha
33410 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t lock..*/.stati
33420 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61  c int proxyRelea
33430 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  seConch(unixFile
33440 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
33450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
33460 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
33470 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64  utine return cod
33480 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  e */.  proxyLock
33490 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
334a0 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  ;  /* The lockin
334b0 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  g context for th
334c0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a  e proxy lock */.
334d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
334e0 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  hFile;        /*
334f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
33500 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43  ch file */..  pC
33510 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
33520 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
33530 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
33540 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d  t;.  conchFile =
33550 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
33560 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
33570 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66  LEASECONCH  %d f
33580 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  or %s pid=%d\n",
33590 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20   conchFile->h,. 
335a0 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
335b0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
335c0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
335d0 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
335e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  , .           ge
335f0 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20  tpid()));.  if( 
33600 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
33610 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f  0 ){.    rc = co
33620 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
33630 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
33640 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
33650 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
33660 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  }.  pCtx->conchH
33670 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41  eld = 0;.  OSTRA
33680 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43  CE(("RELEASECONC
33690 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e  H  %d %s\n", con
336a0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
336b0 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54        (rc==SQLIT
336c0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
336d0 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74  ailed")));.  ret
336e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
336f0 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
33700 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
33710 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
33720 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
33730 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
33740 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
33750 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
33760 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
33770 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
33780 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
33790 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
337a0 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
337b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
337c0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
337d0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
337e0 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
337f0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
33800 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
33810 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
33820 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
33830 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
33840 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
33850 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
33860 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
33870 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
33880 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
33890 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
338a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
338b0 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
338c0 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
338d0 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
338e0 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
338f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33900 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
33910 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
33920 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
33930 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
33940 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
33950 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
33960 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
33970 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
33980 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
33990 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
339a0 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
339b0 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
339c0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
339d0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
339e0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
339f0 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
33a00 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
33a10 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
33a20 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
33a30 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
33a40 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
33a50 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
33a60 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
33a70 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
33a80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33a90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
33aa0 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
33ab0 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
33ac0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
33ad0 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
33ae0 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
33af0 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
33b00 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
33b10 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
33b20 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
33b30 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
33b40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
33b50 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
33b60 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
33b70 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
33b80 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
33b90 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
33ba0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
33bb0 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
33bc0 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
33bd0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
33be0 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
33bf0 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
33c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
33c10 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
33c20 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
33c30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33c40 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
33c50 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
33c60 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
33c70 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
33c80 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
33c90 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
33ca0 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
33cb0 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
33cc0 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
33cd0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
33ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
33cf0 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
33d00 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
33d10 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
33d20 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
33d30 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
33d40 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
33d50 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33d60 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
33d70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
33d80 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
33d90 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
33da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33db0 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20  E_BUSY;.  }  .. 
33dc0 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   /* nothing to d
33dd0 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  o if the path is
33de0 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72   NULL, :auto: or
33df0 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69   matches the exi
33e00 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20  sting path */.  
33e10 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74  if( !path || pat
33e20 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73  h[0]=='\0' || !s
33e30 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75  trcmp(path, ":au
33e40 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c  to:") ||.    (ol
33e50 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d  dPath && !strncm
33e60 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c  p(oldPath, path,
33e70 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b   MAXPATHLEN)) ){
33e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33e90 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
33ea0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f      unixFile *lo
33eb0 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e  ckProxy = pCtx->
33ec0 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70  lockProxy;.    p
33ed0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e  Ctx->lockProxy=N
33ee0 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63  ULL;.    pCtx->c
33ef0 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20  onchHeld = 0;.  
33f00 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21    if( lockProxy!
33f10 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
33f20 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65  c=lockProxy->pMe
33f30 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
33f40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63  lite3_file *)loc
33f50 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69  kProxy);.      i
33f60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33f70 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
33f80 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29  _free(lockProxy)
33f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33fa0 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68  te3_free(oldPath
33fb0 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63  );.    pCtx->loc
33fc0 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
33fd0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
33fe0 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  path);.  }.  .  
33ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34000 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66  .** pFile is a f
34010 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
34020 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72  n opened by a pr
34030 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20  ior xOpen call. 
34040 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20   dbPath.** is a 
34050 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74  string buffer at
34060 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45   least MAXPATHLE
34070 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69  N+1 characters i
34080 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n size..**.** Th
34090 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20  is routine find 
340a0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  the filename ass
340b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69  ociated with pFi
340c0 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74  le and writes it
340d0 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a  .** int dbPath..
340e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
340f0 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
34100 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
34110 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64   *pFile, char *d
34120 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69  bPath){.#if defi
34130 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
34140 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
34150 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74  hod == &afpIoMet
34160 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61  hods ){.    /* a
34170 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61  fp style keeps a
34180 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
34190 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65  e db path in the
341a0 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20   filePath field 
341b0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
341c0 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73  truct */.    ass
341d0 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e  ert( (int)strlen
341e0 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  ((char*)pFile->l
341f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d  ockingContext)<=
34200 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20  MAXPATHLEN );.  
34210 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68    strlcpy(dbPath
34220 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  , ((afpLockingCo
34230 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
34240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
34250 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  dbPath, MAXPATHL
34260 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65  EN);.  } else.#e
34270 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
34280 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f  ->pMethod == &do
34290 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
342a0 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63  {.    /* dot loc
342b0 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65  k style uses the
342c0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
342d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f   to store the do
342e0 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69  t lock.    ** fi
342f0 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
34300 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  nt len = strlen(
34310 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
34320 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d  ockingContext) -
34330 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f   strlen(DOTLOCK_
34340 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d  SUFFIX);.    mem
34350 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
34360 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
34370 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b  ngContext, len +
34380 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
34390 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73    /* all other s
343a0 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f  tyles use the lo
343b0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
343c0 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69   store the db fi
343d0 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61  le path */.    a
343e0 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63  ssert( strlen((c
343f0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
34400 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
34410 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
34420 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
34430 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
34440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41  ckingContext, MA
34450 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20  XPATHLEN);.  }. 
34460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34470 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65  K;.}../*.** Take
34480 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c  s an already fil
34490 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65  led in unix file
344a0 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73   and alters it s
344b0 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69  o all file locki
344c0 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70  ng .** will be p
344d0 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
344e0 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b  local proxy lock
344f0 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c   file.  The foll
34500 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20  owing fields.** 
34510 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e  are preserved in
34520 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
34530 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65  text so that the
34540 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
34550 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e  d and .** the un
34560 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f  ix structure pro
34570 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70  perly cleaned up
34580 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a   at close time:.
34590 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  **  ->lockingCon
345a0 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68  text.**  ->pMeth
345b0 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  od.*/.static int
345c0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
345d0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
345e0 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63   *pFile, const c
345f0 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70  har *path) {.  p
34600 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34610 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72  xt *pCtx;.  char
34620 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c   dbPath[MAXPATHL
34630 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20  EN+1];       /* 
34640 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
34650 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
34660 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55  har *lockPath=NU
34670 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  LL;.  int rc = S
34680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69  QLITE_OK;.  .  i
34690 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
346a0 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock!=NO_LOCK ){.
346b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
346c0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72  E_BUSY;.  }.  pr
346d0 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55  oxyGetDbPathForU
346e0 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64  nixFile(pFile, d
346f0 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70  bPath);.  if( !p
34700 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d  ath || path[0]==
34710 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28  '\0' || !strcmp(
34720 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20  path, ":auto:") 
34730 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d  ){.    lockPath=
34740 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
34750 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61     lockPath=(cha
34760 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20  r *)path;.  }.  
34770 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41  .  OSTRACE(("TRA
34780 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20  NSPROXY  %d for 
34790 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %s pid=%d\n", pF
347a0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
347b0 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c     (lockPath ? l
347c0 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  ockPath : ":auto
347d0 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29 3b  :"), getpid()));
347e0 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74  ..  pCtx = sqlit
347f0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
34800 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69 66  f(*pCtx) );.  if
34810 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
34820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
34830 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
34840 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a 65  et(pCtx, 0, size
34850 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72  of(*pCtx));..  r
34860 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65 43  c = proxyCreateC
34870 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62 50  onchPathname(dbP
34880 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
34890 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69 66  hFilePath);.  if
348a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
348b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ){.    rc = prox
348c0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
348d0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
348e0 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63  ath, &pCtx->conc
348f0 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69  hFile, 0);.    i
34900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
34910 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69 6c  NTOPEN && ((pFil
34920 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
34930 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20  DWR) == 0) ){.  
34940 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74 68      /* if (a) th
34950 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72 65  e open flags are
34960 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62 29   not O_RDWR, (b)
34970 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74   the conch isn't
34980 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20 20   there, and.    
34990 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69 6c    ** (c) the fil
349a0 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61 64  e system is read
349b0 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62  -only, then enab
349c0 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63  le no-locking ac
349d0 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  cess..      ** U
349e0 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e  gh, since O_RDON
349f0 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74 65  LY==0x0000 we te
34a00 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20 73  st for !O_RDWR s
34a10 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61 73  ince unixOpen as
34a20 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 74  serts.      ** t
34a30 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77 69  hat openFlags wi
34a40 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65  ll have only one
34a50 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20   of O_RDONLY or 
34a60 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f  O_RDWR..      */
34a70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
34a80 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
34a90 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 63     struct stat c
34aa0 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20  onchInfo;.      
34ab0 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d  int goLockless =
34ac0 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f   0;..      if( o
34ad0 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e 63  sStat(pCtx->conc
34ae0 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e 63  hFilePath, &conc
34af0 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  hInfo) == -1 ) {
34b00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72  .        int err
34b10 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
34b20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f 45    if( (err==ENOE
34b30 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28 64  NT) && (statfs(d
34b40 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  bPath, &fsInfo) 
34b50 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  != -1) ){.      
34b60 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d      goLockless =
34b70 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73   (fsInfo.f_flags
34b80 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20  &MNT_RDONLY) == 
34b90 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  MNT_RDONLY;.    
34ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34bb0 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c 65      if( goLockle
34bc0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ss ){.        pC
34bd0 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
34be0 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c 79  -1; /* read only
34bf0 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f   FS/ lockless */
34c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
34c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
34c20 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 69  .    }.  }  .  i
34c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34c40 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29 7b 0a   && lockPath ){.
34c50 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
34c60 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
34c70 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c 6f 63  3DbStrDup(0, loc
34c80 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 69  kPath);.  }..  i
34c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34ca0 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 64 62   ){.    pCtx->db
34cb0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62  Path = sqlite3Db
34cc0 53 74 72 44 75 70 28 30 2c 20 64 62 50 61 74 68  StrDup(0, dbPath
34cd0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  );.    if( pCtx-
34ce0 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b  >dbPath==NULL ){
34cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34d00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
34d10 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
34d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
34d30 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69 73 20  * all memory is 
34d40 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f 78 79  allocated, proxy
34d50 73 20 61 72 65 20 63 72 65 61 74 65 64 20 61 6e  s are created an
34d60 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20 20 20  d assigned, .   
34d70 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65 20 6c   ** switch the l
34d80 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 61  ocking context a
34d90 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65 6e 20  nd pMethod then 
34da0 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20  return..    */. 
34db0 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b     pCtx->oldLock
34dc0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 46 69  ingContext = pFi
34dd0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34de0 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  xt;.    pFile->l
34df0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
34e00 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78 2d 3e  pCtx;.    pCtx->
34e10 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70 46 69  pOldMethod = pFi
34e20 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20 20 20  le->pMethod;.   
34e30 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
34e40 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
34e50 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
34e60 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  if( pCtx->conchF
34e70 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20 70 43  ile ){ .      pC
34e80 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  tx->conchFile->p
34e90 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
34ea0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70  sqlite3_file *)p
34eb0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
34ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
34ed0 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
34ee0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ile);.    }.    
34ef0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
34f00 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
34f10 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
34f20 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f  e3_free(pCtx->co
34f30 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20  nchFilePath); . 
34f40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34f50 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  pCtx);.  }.  OST
34f60 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f 58  RACE(("TRANSPROX
34f70 59 20 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  Y  %d %s\n", pFi
34f80 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
34f90 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
34fa0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
34fb0 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d")));.  return 
34fc0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
34fd0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c  is routine handl
34fe0 65 73 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  es sqlite3_file_
34ff0 63 6f 6e 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20  control() calls 
35000 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66 69  that are specifi
35010 63 0a 2a 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f  c.** to proxy lo
35020 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
35030 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
35040 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
35050 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
35060 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
35070 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
35080 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45 54   case SQLITE_GET
35090 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20  _LOCKPROXYFILE: 
350a0 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  {.      unixFile
350b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
350c0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 69  ile*)id;.      i
350d0 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
350e0 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74  d == &proxyIoMet
350f0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20  hods ){.        
35100 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35110 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
35120 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
35130 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
35140 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
35150 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
35160 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
35170 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  if( pCtx->lockPr
35180 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
35190 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61       *(const cha
351a0 72 20 2a 2a 29 70 41 72 67 20 3d 20 70 43 74 78  r **)pArg = pCtx
351b0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b  ->lockProxyPath;
351c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
351d0 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e 73            *(cons
351e0 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20 3d  t char **)pArg =
351f0 20 22 3a 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65   ":auto: (not he
35200 6c 64 29 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ld)";.        }.
35210 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
35220 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
35230 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55  har **)pArg = NU
35240 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
35250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35260 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
35270 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  se SQLITE_SET_LO
35280 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
35290 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
352a0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
352b0 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  *)id;.      int 
352c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
352d0 20 20 20 20 20 20 69 6e 74 20 69 73 50 72 6f 78        int isProx
352e0 79 53 74 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d  yStyle = (pFile-
352f0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
35300 78 79 49 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20  xyIoMethods);.  
35310 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
35320 4c 4c 20 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61  LL || (const cha
35330 72 20 2a 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20  r *)pArg==0 ){. 
35340 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
35350 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
35360 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66       /* turn off
35370 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d   proxy locking -
35380 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 2a   not supported *
35390 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
353a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a   SQLITE_ERROR /*
353b0 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f  SQLITE_PROTOCOL?
353c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a   SQLITE_MISUSE?*
353d0 2f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  /;.        }else
353e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
353f0 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
35400 63 6b 69 6e 67 20 2d 20 61 6c 72 65 61 64 79 20  cking - already 
35410 6f 66 66 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20  off - NOOP */.  
35420 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35430 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
35440 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
35450 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
35460 72 20 2a 70 72 6f 78 79 50 61 74 68 20 3d 20 28  r *proxyPath = (
35470 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72  const char *)pAr
35480 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  g;.        if( i
35490 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20  sProxyStyle ){. 
354a0 20 20 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f           proxyLo
354b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
354c0 74 78 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  tx = .          
354d0 20 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43    (proxyLockingC
354e0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
354f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
35500 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 74           if( !st
35510 72 63 6d 70 28 70 41 72 67 2c 20 22 3a 61 75 74  rcmp(pArg, ":aut
35520 6f 3a 22 29 20 0a 20 20 20 20 20 20 20 20 20 20  o:") .          
35530 20 7c 7c 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50   || (pCtx->lockP
35540 72 6f 78 79 50 61 74 68 20 26 26 0a 20 20 20 20  roxyPath &&.    
35550 20 20 20 20 20 20 20 20 20 20 20 21 73 74 72 6e             !strn
35560 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
35570 6f 78 79 50 61 74 68 2c 20 70 72 6f 78 79 50 61  oxyPath, proxyPa
35580 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29  th, MAXPATHLEN))
35590 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
355a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
355b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
355c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
355d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 77 69 74         rc = swit
355e0 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28  chLockProxyPath(
355f0 70 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68  pFile, proxyPath
35600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
35610 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35620 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
35630 6f 6e 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  on proxy file lo
35640 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  cking */.       
35650 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
35660 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70  nsformUnixFile(p
35670 46 69 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29  File, proxyPath)
35680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35690 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
356a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
356b0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
356c0 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a  assert( 0 );  /*
356d0 20 54 68 65 20 63 61 6c 6c 20 61 73 73 75 72 65   The call assure
356e0 73 20 74 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69  s that only vali
356f0 64 20 6f 70 63 6f 64 65 73 20 61 72 65 20 73 65  d opcodes are se
35700 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt */.    }.  }.
35710 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
35720 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35730 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
35740 20 57 69 74 68 69 6e 20 74 68 69 73 20 64 69 76   Within this div
35750 69 73 69 6f 6e 20 28 74 68 65 20 70 72 6f 78 79  ision (the proxy
35760 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ing locking impl
35770 65 6d 65 6e 74 61 74 69 6f 6e 29 20 74 68 65 20  ementation) the 
35780 70 72 6f 63 65 64 75 72 65 73 0a 2a 2a 20 61 62  procedures.** ab
35790 6f 76 65 20 74 68 69 73 20 70 6f 69 6e 74 20 61  ove this point a
357a0 72 65 20 61 6c 6c 20 75 74 69 6c 69 74 69 65 73  re all utilities
357b0 2e 20 20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61  .  The lock-rela
357c0 74 65 64 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  ted methods of t
357d0 68 65 0a 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b  he.** proxy-lock
357e0 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ing sqlite3_io_m
357f0 65 74 68 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c  ethod object fol
35800 6c 6f 77 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  low..*/.../*.** 
35810 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
35820 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
35830 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
35840 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
35850 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
35860 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
35870 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
35880 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
35890 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
358a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
358b0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
358c0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
358d0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
358e0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
358f0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
35900 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
35910 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
35920 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
35930 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
35940 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  nt proxyCheckRes
35950 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
35960 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
35970 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e  *pResOut) {.  un
35980 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
35990 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
359a0 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54   int rc = proxyT
359b0 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b  akeConch(pFile);
359c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
359d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78  E_OK ){.    prox
359e0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
359f0 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
35a00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
35a10 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
35a20 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  text;.    if( pC
35a30 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20  tx->conchHeld>0 
35a40 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c  ){.      unixFil
35a50 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d  e *proxy = pCtx-
35a60 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
35a70 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e    return proxy->
35a80 70 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52  pMethod->xCheckR
35a90 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c  eservedLock((sql
35aa0 69 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79  ite3_file*)proxy
35ab0 2c 20 70 52 65 73 4f 75 74 29 3b 0a 20 20 20 20  , pResOut);.    
35ac0 7d 65 6c 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48  }else{ /* conchH
35ad0 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c  eld < 0 is lockl
35ae0 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  ess */.      pRe
35af0 73 4f 75 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20  sOut=0;.    }.  
35b00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35b10 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
35b20 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
35b30 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
35b40 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
35b50 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
35b60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
35b70 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
35b80 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
35b90 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
35ba0 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
35bb0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
35bc0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
35bd0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
35be0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
35bf0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
35c00 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
35c10 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
35c20 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
35c30 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
35c40 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
35c50 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
35c60 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
35c70 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
35c80 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
35c90 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
35ca0 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
35cb0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
35cc0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
35cd0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
35ce0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
35cf0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
35d00 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
35d10 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
35d20 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
35d30 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
35d40 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
35d50 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
35d60 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
35d70 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
35d80 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
35d90 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
35da0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
35db0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
35dc0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
35dd0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
35de0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
35df0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
35e00 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
35e10 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
35e20 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
35e30 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
35e40 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74   proxyLock(sqlit
35e50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
35e60 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
35e70 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
35e80 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
35e90 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78  .  int rc = prox
35ea0 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65  yTakeConch(pFile
35eb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
35ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72  ITE_OK ){.    pr
35ed0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35ee0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
35ef0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35f00 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35f10 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ontext;.    if( 
35f20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e  pCtx->conchHeld>
35f30 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  0 ){.      unixF
35f40 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74  ile *proxy = pCt
35f50 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20  x->lockProxy;.  
35f60 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e      rc = proxy->
35f70 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
35f80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 72  sqlite3_file*)pr
35f90 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29 3b  oxy, eFileLock);
35fa0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
35fb0 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79 2d  ileLock = proxy-
35fc0 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
35fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
35fe0 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
35ff0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
36000 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
36010 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
36020 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
36030 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
36040 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
36050 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
36060 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
36070 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
36080 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
36090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
360a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
360b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
360c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
360d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
360e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
360f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
36100 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
36110 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
36120 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
36130 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
36140 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
36150 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
36160 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
36170 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  id;.  int rc = p
36180 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46  roxyTakeConch(pF
36190 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ile);.  if( rc==
361a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
361b0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
361c0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
361d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
361e0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
361f0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69  ngContext;.    i
36200 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  f( pCtx->conchHe
36210 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ld>0 ){.      un
36220 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20  ixFile *proxy = 
36230 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
36240 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78  .      rc = prox
36250 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c  y->pMethod->xUnl
36260 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
36270 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c 65 4c  e*)proxy, eFileL
36280 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  ock);.      pFil
36290 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  e->eFileLock = p
362a0 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  roxy->eFileLock;
362b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
362c0 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20 3c    /* conchHeld <
362d0 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20 2a   0 is lockless *
362e0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
362f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36300 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 74  * Close a file t
36310 68 61 74 20 75 73 65 73 20 70 72 6f 78 79 20 6c  hat uses proxy l
36320 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
36330 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
36340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
36350 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
36360 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
36370 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
36380 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63  id;.    proxyLoc
36390 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
363a0 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
363b0 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
363c0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
363d0 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  ;.    unixFile *
363e0 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78  lockProxy = pCtx
363f0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
36400 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36410 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  File = pCtx->con
36420 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  chFile;.    int 
36430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36440 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c 6f 63      .    if( loc
36450 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  kProxy ){.      
36460 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
36470 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
36480 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36490 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f  lockProxy, NO_LO
364a0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
364b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
364c0 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72       rc = lockPr
364d0 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43  oxy->pMethod->xC
364e0 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69  lose((sqlite3_fi
364f0 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  le*)lockProxy);.
36500 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
36510 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63  sqlite3_free(loc
36530 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 70  kProxy);.      p
36540 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d  Ctx->lockProxy =
36550 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
36560 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b 0a 20  ( conchFile ){. 
36570 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63       if( pCtx->c
36580 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20 20 20  onchHeld ){.    
36590 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 52 65      rc = proxyRe
365a0 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69 6c 65  leaseConch(pFile
365b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
365c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
365d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
365e0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
365f0 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71  thod->xClose((sq
36600 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
36610 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  hFile);.      if
36620 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36640 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65 29 3b  free(conchFile);
36650 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
36660 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74 78  e3DbFree(0, pCtx
36670 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29  ->lockProxyPath)
36680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
36690 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  ee(pCtx->conchFi
366a0 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  lePath);.    sql
366b0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43  ite3DbFree(0, pC
366c0 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20  tx->dbPath);.   
366d0 20 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   /* restore the 
366e0 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  original locking
366f0 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65   context and pMe
36700 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20  thod then close 
36710 69 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  it */.    pFile-
36720 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
36730 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69  = pCtx->oldLocki
36740 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70  ngContext;.    p
36750 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
36760 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64  pCtx->pOldMethod
36770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
36780 65 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65  ee(pCtx);.    re
36790 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74  turn pFile->pMet
367a0 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b  hod->xClose(id);
367b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
367c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65  LITE_OK;.}....#e
367d0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
367e0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
367f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36800 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
36810 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
36820 6b 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e  king style is in
36830 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
36840 69 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74  ith AFP filesyst
36850 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63  ems..** And sinc
36860 65 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75  e AFP is only su
36870 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53  pported on MacOS
36880 58 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  X, the proxy loc
36890 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  king is also.** 
368a0 72 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61  restricted to Ma
368b0 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a  cOSX..** .**.***
368c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
368d0 20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78   End of the prox
368e0 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  y lock implement
368f0 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
36900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
36910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
36960 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
36970 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
36980 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
36990 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
369a0 65 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20  e registers all 
369b0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
369c0 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b  ons for unix-lik
369d0 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
369e0 79 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f  ystems.  This ro
369f0 75 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73  utine, and the s
36a00 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20  qlite3_os_end() 
36a10 72 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c  routine that fol
36a20 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  lows,.** should 
36a30 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
36a40 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
36a50 65 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62  e that are visib
36a60 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a  le from other.**
36a70 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
36a80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
36a90 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67  lled once during
36aa0 20 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69   SQLite initiali
36ab0 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a  zation and by a.
36ac0 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64  ** single thread
36ad0 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
36ae0 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74  location and mut
36af0 65 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61  ex subsystems ha
36b00 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73  ve not.** necess
36b10 61 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69  arily been initi
36b20 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
36b30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36b40 65 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a  ed, and so they.
36b50 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ** should not be
36b60 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71   used..*/.int sq
36b70 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
36b80 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a  id){ .  /* .  **
36b90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
36ba0 61 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20  acro defines an 
36bb0 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
36bc0 61 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  an sqlite3_vfs o
36bd0 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
36be0 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
36bf0 69 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41  is NAME.  The pA
36c00 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
36c10 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
36c20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69  .  ** to the "fi
36c30 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20  nder" function. 
36c40 20 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20   (pAppData is a 
36c50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69  pointer to a poi
36c60 6e 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a  nter because.  *
36c70 2a 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65  * silly C90 rule
36c80 73 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69  s prohibit a voi
36c90 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61  d* from being ca
36ca0 73 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  st to a function
36cb0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e   pointer.  ** an
36cc0 64 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  d so we have to 
36cd0 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  go through the i
36ce0 6e 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e  ntermediate poin
36cf0 74 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  ter to avoid pro
36d00 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20  blems.  ** when 
36d10 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d  compiling with -
36d20 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
36d30 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20  on GCC.).  **.  
36d40 2a 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61  ** The FINDER pa
36d50 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
36d60 6d 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d  macro is the nam
36d70 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  e of the pointer
36d80 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   to the.  ** fin
36d90 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54  der-function.  T
36da0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
36db0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
36dc0 6e 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  nter to the.  **
36dd0 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f   sqlite_io_metho
36de0 64 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ds object that i
36df0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65  mplements the de
36e00 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20  sired locking.  
36e10 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53  ** behaviors.  S
36e20 65 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  ee the division 
36e30 61 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61  above that conta
36e40 69 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44  ins the IOMETHOD
36e50 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72  S.  ** macro for
36e60 20 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d   addition inform
36e70 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d  ation on finder-
36e80 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a  functions..  **.
36e90 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72    ** Most finder
36ea0 73 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  s simply return 
36eb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
36ec0 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
36ed0 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a  methods.  ** obj
36ee0 65 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61  ect.  But the "a
36ef0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22  utolockIoFinder"
36f00 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
36f10 63 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74  cOSX does a litt
36f20 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  le.  ** more tha
36f30 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73  n that; it looks
36f40 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
36f50 65 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73  em type that hos
36f60 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  ts the .  ** dat
36f70 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
36f80 72 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61  ries to choose a
36f90 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  n locking method
36fa0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
36fb0 0a 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73  .  ** that files
36fc0 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f  ystem time..  */
36fd0 0a 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56  .  #define UNIXV
36fe0 46 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44  FS(VFSNAME, FIND
36ff0 45 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ER) {           
37000 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37010 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
37020 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
37030 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
37040 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37050 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
37060 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
37070 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
37080 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d           \.    M
37090 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20  AX_PATHNAME,    
370a0 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
370b0 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
370c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20         \.    0, 
370d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370e0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20     /* pNext */  
370f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37100 20 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41       \.    VFSNA
37110 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
37120 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20   /* zName */    
37130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37140 20 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29     \.    (void*)
37150 26 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f  &FINDER,       /
37160 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20  * pAppData */   
37170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37180 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c   \.    unixOpen,
37190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
371a0 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20  xOpen */        
371b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
371c0 0a 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c  .    unixDelete,
371d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
371e0 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20  elete */        
371f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37200 20 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20     unixAccess,  
37210 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
37220 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ess */          
37230 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37240 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
37250 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
37260 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  athname */      
37270 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37280 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  nixDlOpen,      
37290 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
372a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
372b0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
372c0 78 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  xDlError,       
372d0 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
372e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
372f0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37300 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
37310 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20   /* xDlSym */   
37320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37330 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43     \.    unixDlC
37340 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
37350 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20  * xDlClose */   
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 20 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f   \.    unixRando
37380 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
37390 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20  xRandomness */  
373a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
373b0 0a 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20  .    unixSleep, 
373c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
373d0 6c 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20  leep */         
373e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
373f0 20 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69     unixCurrentTi
37400 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
37410 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20  rentTime */     
37420 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37430 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
37440 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
37450 73 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20  stError */      
37460 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37470 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
37480 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
37490 54 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20  TimeInt64 */    
374a0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
374b0 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  xSetSystemCall, 
374c0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
374d0 43 61 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  Call */         
374e0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
374f0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
37500 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
37510 6c 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ll */           
37520 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4e 65 78     \.    unixNex
37530 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
37540 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
37550 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
37560 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   \.  }..  /*.  *
37570 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46  * All default VF
37580 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65  Ses for unix are
37590 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
375a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
375b0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  y..  **.  ** Not
375c0 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  e that the sqlit
375d0 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65  e3_vfs.pNext fie
375e0 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62  ld of the VFS ob
375f0 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ject is modified
37600 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c  .  ** by the SQL
37610 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68  ite core when th
37620 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65  e VFS is registe
37630 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c  red.  So the fol
37640 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61  lowing.  ** arra
37650 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73  y cannot be cons
37660 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  t..  */.  static
37670 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
37680 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49  s[] = {.#if SQLI
37690 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
376a0 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56  G_STYLE && (OS_V
376b0 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65  XWORKS || define
376c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20  d(__APPLE__)).  
376d0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
376e0 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c  ,          autol
376f0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
37700 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53  else.    UNIXVFS
37710 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
37720 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
37730 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e  ),.#endif.    UN
37740 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65  IXVFS("unix-none
37750 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ",     nolockIoF
37760 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
37770 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69  XVFS("unix-dotfi
37780 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  le",  dotlockIoF
37790 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
377a0 58 56 46 53 28 22 75 6e 69 78 2d 65 78 63 6c 22  XVFS("unix-excl"
377b0 2c 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e  ,     posixIoFin
377c0 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f 56 58  der ),.#if OS_VX
377d0 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56 46  WORKS.    UNIXVF
377e0 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73 65 6d  S("unix-namedsem
377f0 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72 20 29  ", semIoFinder )
37800 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ,.#endif.#if SQL
37810 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
37820 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55 4e 49  NG_STYLE.    UNI
37830 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73 69 78  XVFS("unix-posix
37840 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e  ",    posixIoFin
37850 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53 5f 56  der ),.#if !OS_V
37860 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58 56  XWORKS.    UNIXV
37870 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c  FS("unix-flock",
37880 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65      flockIoFinde
37890 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  r ),.#endif.#end
378a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
378b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
378c0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
378d0 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55 4e 49  APPLE__).    UNI
378e0 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70 22 2c  XVFS("unix-afp",
378f0 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e 64 65        afpIoFinde
37900 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
37910 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20 20 20  ("unix-nfs",    
37920 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20 29 2c    nfsIoFinder ),
37930 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
37940 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20 70 72  ix-proxy",    pr
37950 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  oxyIoFinder ),.#
37960 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75 6e 73  endif.  };.  uns
37970 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20 20 20  igned int i;    
37980 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37990 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52  unter */..  /* R
379a0 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
379b0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
379c0 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20 2a 2f   aVfs[] array */
379d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 73  .  for(i=0; i<(s
379e0 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69 7a 65  izeof(aVfs)/size
379f0 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29  of(sqlite3_vfs))
37a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
37a10 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
37a20 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (&aVfs[i], i==0)
37a30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
37a40 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
37a50 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
37a60 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
37a70 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  m interface..**.
37a80 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  ** Some operatin
37a90 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68 74 20  g systems might 
37aa0 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d 65 20  need to do some 
37ab0 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69 73 20  cleanup in this 
37ac0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f 20 72  routine,.** to r
37ad0 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63 61 6c  elease dynamical
37ae0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a  ly allocated obj
37af0 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74 20 6f  ects.  But not o
37b00 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69 73 20  n unix..** This 
37b10 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
37b20 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  op for unix..*/.
37b30 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
37b40 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
37b50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
37b60 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }. .#endif /* SQ
37b70 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a 2f 0a  LITE_OS_UNIX */.