/ Hex Artifact Content
Login

Artifact 9da63854b702e0855ce13711a80d8bdcc5b69549:


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 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
12c0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
12d0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
12e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
12f0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
1300: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
1310: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1320: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1330: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1340: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1350: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1360: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1370: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1380: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1390: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
13a0: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
13b0: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
13c0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
13d0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
13e0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
13f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1400: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1410: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1420: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1430: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1450: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1460: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1470: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1480: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1490: 20 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d   ** Default perm
14a0: 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65  issions when cre
14b0: 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79  ating auto proxy
14c0: 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e 64 65 66   dir. */.#ifndef
14d0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14e0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14f0: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
1500: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
1510: 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
1520: 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f  S 0755.#endif../
1530: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70  *.** Maximum sup
1540: 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67  ported path-leng
1550: 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  th..*/.#define M
1560: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
1570: 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20  ./*.** Only set 
1580: 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66  the lastErrno if
1590: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
15a0: 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20  is a real error 
15b0: 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f  and not .** a no
15c0: 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65  rmal expected re
15d0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
15e0: 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49  ITE_BUSY or SQLI
15f0: 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65  TE_OK.*/.#define
1600: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78   IS_LOCK_ERROR(x
1610: 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45  )  ((x != SQLITE
1620: 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51  _OK) && (x != SQ
1630: 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20  LITE_BUSY))../* 
1640: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1650: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
1660: 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69  ruct unixShm uni
1670: 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xShm;           
1680: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1690: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
16a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16b0: 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e  t unixShmNode un
16c0: 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  ixShmNode;      
16d0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
16e0: 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79  y instance */.ty
16f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69  pedef struct uni
1700: 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49  xInodeInfo unixI
1710: 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41  nodeInfo;   /* A
1720: 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65  n i-node */.type
1730: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55  def struct UnixU
1740: 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73  nusedFd UnixUnus
1750: 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20  edFd;     /* An 
1760: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1770: 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  riptor */../*.**
1780: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65   Sometimes, afte
1790: 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  r a file handle 
17a0: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c  is closed by SQL
17b0: 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65  ite, the file de
17c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e  scriptor.** cann
17d0: 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d  ot be closed imm
17e0: 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65  ediately. In the
17f0: 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e  se cases, instan
1800: 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ces of the follo
1810: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
1820: 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74  e are used to st
1830: 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ore the file des
1840: 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61  criptor while wa
1850: 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20  iting for an.** 
1860: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65  opportunity to e
1870: 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72  ither close or r
1880: 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  euse it..*/.stru
1890: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
18a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
18d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
18e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
18f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1900: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1910: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1920: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1930: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1950: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1960: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1970: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1980: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1990: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
19a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
19b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
19c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
19d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
19e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
19f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1a00: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1a10: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1a20: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1a30: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1a40: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1a50: 65 6e 74 72 79 20 2a 2f 0a 20 20 75 6e 69 78 49  entry */.  unixI
1a60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a80: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1a90: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1ae0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1af0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b10: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
1b20: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1b30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b40: 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20   ctrlFlags;     
1b50: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1b60: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1b70: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1b80: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1bb0: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1bc0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1bd0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1be0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1bf0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1c00: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1c10: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1c20: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1c50: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1c70: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c90: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1ca0: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1cd0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1ce0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1cf0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1d20: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1d30: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1d40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1d50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1d60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1d90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1da0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1db0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1dc0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1dd0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1de0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1e10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1e20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1e30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1e40: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c   /* Delete on cl
1e70: 6f 73 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ose if true */. 
1e80: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
1e90: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20  ileId *pId;     
1ea0: 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66       /* Unique f
1eb0: 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66  ile ID */.#endif
1ec0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ed0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1ee0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1ef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1f00: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1f10: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
1f20: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1f30: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
1f40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1f50: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
1f60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
1f70: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
1f80: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
1f90: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
1fa0: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
1fb0: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
1fc0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
1fd0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
1fe0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1ff0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2000: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2010: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2020: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2030: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2040: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2050: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2060: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2070: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2080: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
20a0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
20b0: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
20c0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
20d0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
20e0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
20f0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2110: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2120: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2130: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2140: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
2150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2160: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2170: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2180: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2190: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
21a0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
21b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
21c0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
21d0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
21e0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
21f0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2200: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2210: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2220: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2230: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2240: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2250: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2260: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2270: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2280: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2290: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
22a0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
22b0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
22c0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
22d0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
22e0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
22f0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2300: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2310: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2320: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2330: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2340: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2350: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2360: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2370: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2380: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2390: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
23a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23b0: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
23c0: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
23d0: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
23e0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
23f0: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2400: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2410: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
2420: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
2430: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
2440: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
2450: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
2460: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
2470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2480: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2490: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
24a0: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
24b0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
24c0: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
24d0: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
24e0: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
24f0: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2500: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2510: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2520: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
2530: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
2540: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
2550: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
2560: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2570: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2580: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2590: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
25a0: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
25b0: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
25c0: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
25d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
25e0: 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73  fferent Unix sys
25f0: 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65  tems declare ope
2600: 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74  n() in different
2610: 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65   ways.  Same use
2620: 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63  .** open(const c
2630: 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29  har*,int,mode_t)
2640: 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70  .  Others use op
2650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
2660: 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20  nt,...)..** The 
2670: 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d  difference is im
2680: 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69  portant when usi
2690: 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
26a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
26b0: 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77  .** The safest w
26c0: 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ay to deal with 
26d0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
26e0: 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69  o always use thi
26f0: 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69  s wrapper.** whi
2700: 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68  ch always has th
2710: 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69  e same well-defi
2720: 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ned interface..*
2730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
2740: 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  ixOpen(const cha
2750: 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c  r *zFile, int fl
2760: 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a  ags, int mode){.
2770: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46    return open(zF
2780: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65  ile, flags, mode
2790: 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  );.}../* Forward
27a0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27b0: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
27c0: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
27d0: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a  r*, int*);../*.*
27e0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
27f0: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2800: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2810: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2820: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2830: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2840: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2850: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2860: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2870: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2880: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2890: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
28a0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
28b0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
28c0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
28d0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
28f0: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2900: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2910: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2920: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2930: 20 73 79 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20   sytem call */. 
2940: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
2950: 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f  _ptr pCurrent; /
2960: 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * Current value 
2970: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2980: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2990: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66  syscall_ptr pDef
29a0: 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74  ault; /* Default
29b0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73   value */.} aSys
29c0: 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22  call[] = {.  { "
29d0: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28  open",         (
29e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
29f0: 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20  ptr)posixOpen,  
2a00: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2a10: 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28  Open      ((int(
2a20: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
2a30: 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  nt,int))aSyscall
2a40: 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [0].pCurrent).. 
2a50: 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20   { "close",     
2a60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2a70: 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20  all_ptr)close,  
2a80: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2a90: 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28  e osClose     ((
2aa0: 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73  int(*)(int))aSys
2ab0: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2ac0: 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c  )..  { "access",
2ad0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ae0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65  syscall_ptr)acce
2af0: 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ss,     0  },.#d
2b00: 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20  efine osAccess  
2b10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2b20: 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73   char*,int))aSys
2b30: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
2b40: 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c  )..  { "getcwd",
2b50: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2b60: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63  syscall_ptr)getc
2b70: 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  wd,     0  },.#d
2b80: 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20  efine osGetcwd  
2b90: 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61    ((char*(*)(cha
2ba0: 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  r*,size_t))aSysc
2bb0: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2bc0: 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20  ..  { "stat",   
2bd0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2be0: 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c  yscall_ptr)stat,
2bf0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65         0  },.#de
2c00: 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20  fine osStat     
2c10: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2c20: 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61  char*,struct sta
2c30: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e  t*))aSyscall[4].
2c40: 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a  pCurrent)../*.**
2c50: 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69   The DJGPP compi
2c60: 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ler environment 
2c70: 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b  looks mostly lik
2c80: 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a  e Unix, but it.*
2c90: 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74  * lacks the fcnt
2ca0: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  l() system call.
2cb0: 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63    So redefine fc
2cc0: 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65  ntl() to be some
2cd0: 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c  thing.** that al
2ce0: 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 20  ways succeeds.  
2cf0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
2d00: 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74  locking does not
2d10: 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20   occur under.** 
2d20: 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20 69  DJGPP.  But it i
2d30: 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64  s DOS - what did
2d40: 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a   you expect?.*/.
2d50: 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f  #ifdef __DJGPP__
2d60: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
2d70: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
2d80: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64          0  },.#d
2d90: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c  efine osFstat(a,
2da0: 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20  b,c)    0.#else 
2db0: 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22      .  { "fstat"
2dc0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2dd0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73  3_syscall_ptr)fs
2de0: 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  tat,      0  },.
2df0: 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20  #define osFstat 
2e00: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2e10: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
2e20: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
2e30: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b  ent).#endif..  {
2e40: 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20   "ftruncate",   
2e50: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e60: 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c  l_ptr)ftruncate,
2e70: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2e80: 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e  osFtruncate ((in
2e90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29  t(*)(int,off_t))
2ea0: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
2eb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74  rent)..  { "fcnt
2ec0: 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  l",        (sqli
2ed0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2ee0: 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d  fcntl,      0  }
2ef0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74  ,.#define osFcnt
2f00: 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69  l     ((int(*)(i
2f10: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
2f20: 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74  call[7].pCurrent
2f30: 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20  )..  { "read",  
2f40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2f50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
2f60: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f70: 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20  efine osRead    
2f80: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
2f90: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  nt,void*,size_t)
2fa0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
2fb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
2fc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
2fd0: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
2fe0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ff0: 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20  { "pread",      
3000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3010: 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20  ll_ptr)pread,   
3020: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3030: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3040: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3050: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3060: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3070: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3080: 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a       ((ssize_t(*
3090: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
30a0: 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  _t,off_t))aSysca
30b0: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
30c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
30d0: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
30e0: 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73  read64",      (s
30f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3100: 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20 30  tr)pread64,    0
3110: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3120: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3130: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3140: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3150: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3160: 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20  fine osPread64  
3170: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3180: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3190: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
31a0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
31b0: 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20 20  { "write",      
31c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31d0: 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20  ll_ptr)write,   
31e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31f0: 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28 73   osWrite     ((s
3200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3220: 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70  ))aSyscall[11].p
3230: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3240: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
3250: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
3260: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
3270: 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20    { "pwrite",   
3280: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3290: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c  call_ptr)pwrite,
32a0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65       0  },.#else
32b0: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
32c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
32e0: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
32f0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3300: 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74  ite    ((ssize_t
3310: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3320: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3330: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3340: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3350: 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [12].pCurrent)..
3360: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3370: 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77  PREAD64).  { "pw
3380: 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71  rite64",     (sq
3390: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
33a0: 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30 20  r)pwrite64,   0 
33b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
33c0: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
33d0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
33e0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
33f0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3400: 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20 20  ine osPwrite64  
3410: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3420: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a  ,const void*,siz
3430: 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20  e_t,off_t))\.   
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43   aSyscall[13].pC
3460: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3470: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3480: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 66 63  NG_STYLE.  { "fc
3490: 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71  hmod",       (sq
34a0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
34b0: 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 30 20  r)fchmod,     0 
34c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66   },.#else.  { "f
34d0: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
34e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34f0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3500: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3510: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
3520: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
3530: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3550: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
3560: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
3570: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
3580: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
3590: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
35a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35b0: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
35c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
35d0: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
35e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
35f0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3610: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
3620: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
3630: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
3640: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3650: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
3660: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
3670: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3680: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
3690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
36a0: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
36b0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
36c0: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
36d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
36e0: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
36f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3700: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
3710: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
3720: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
3730: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
3740: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
3750: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
3760: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
3770: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3780: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3790: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
37a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
37b0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
37c0: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
37d0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
37e0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
37f0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3800: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3810: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3820: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3830: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3840: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3850: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3860: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3870: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3880: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3890: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
38a0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
38b0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
38c0: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
38d0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
38e0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
38f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3910: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3920: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3930: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3940: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3950: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3960: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3970: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3980: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3990: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
39a0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
39b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
39c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
39d0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
39e0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
39f0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3a00: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3a10: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3a20: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3a30: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3a60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3a70: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3a80: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3aa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3ab0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
3ac0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3ad0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
3ae0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3af0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3b00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
3b10: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
3b20: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
3b30: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
3b40: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
3b50: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
3b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
3b70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
3b80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
3b90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
3ba0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
3bb0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
3bc0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
3bd0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
3be0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
3c00: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
3c10: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
3c20: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
3c30: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
3c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3c50: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
3c60: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
3c70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3c80: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
3c90: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
3ca0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
3cb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3cd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3ce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3cf0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
3d00: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
3d10: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
3d20: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
3d30: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
3d40: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
3d50: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
3d60: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
3d70: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
3d80: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
3d90: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
3da0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
3db0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
3dc0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
3dd0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
3de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
3df0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
3e00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
3e10: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
3e20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
3e30: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
3e40: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
3e50: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
3e60: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
3e70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
3e80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
3e90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
3ea0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
3eb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3ec0: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
3ed0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
3ee0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
3ef0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
3f00: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
3f10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3f20: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
3f30: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
3f40: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
3f50: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
3f60: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
3f70: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
3f80: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
3f90: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
3fa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3fb0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
3fc0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
3fd0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
3fe0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
3ff0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
4000: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
4010: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4020: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4030: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4040: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4050: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4060: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4070: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4090: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
40a0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
40b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
40c0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
40d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
40e0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
40f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4100: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 6f  }../*.** Retry o
4110: 70 65 6e 28 29 20 63 61 6c 6c 73 20 74 68 61 74  pen() calls that
4120: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
4130: 54 52 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  TR.*/.static int
4140: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4160: 66 2c 20 69 6e 74 20 6d 29 7b 0a 20 20 69 6e 74  f, int m){.  int
4170: 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20   rc;.  do{ rc = 
4180: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 29 3b 20 7d  osOpen(z,f,m); }
4190: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
41a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
41b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
41c0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
41d0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
41e0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
41f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
4200: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
4210: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
4220: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
4230: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
4240: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
4250: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
4260: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
4270: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
4280: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
4290: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
42a0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
42b0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
42c0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
42d0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
42e0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
42f0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
4300: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4310: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
4320: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
4330: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
4340: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
4350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
4360: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
4370: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
4380: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
4390: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
43a0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
43b0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
43c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
43d0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
43e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
43f0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
4400: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4410: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
4420: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4430: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
4440: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
4450: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
4460: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
4470: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4480: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
4490: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
44a0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
44b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
44c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
44d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
44e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
44f0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
4500: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4510: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
4520: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
4530: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
4540: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
4550: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
4560: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
4570: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
4580: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
4590: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
45a0: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
45b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
45c0: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
45d0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
45e0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
45f0: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
4600: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
4610: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
4620: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
4630: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
4640: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
4650: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
4660: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
4670: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
4680: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
4690: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
46a0: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
46b0: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
46c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
46d0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
46e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
46f0: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
4700: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
4710: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
4720: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
4730: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
4740: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
4750: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
4760: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
4770: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
4780: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
4790: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
47a0: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
47b0: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
47c0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
47d0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
47e0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
47f0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
4800: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
4810: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
4820: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
4830: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
4840: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
4850: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
4860: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
4870: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
4880: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
4890: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
48a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
48b0: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
48c0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
48d0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
48e0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
48f0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
4900: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4910: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
4920: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
4930: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
4940: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
4950: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4960: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
4970: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
4980: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
4990: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
49a0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
49b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
49c0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
49d0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
49e0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
49f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
4a00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4a10: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
4a20: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
4a30: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
4a40: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
4a50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
4a60: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
4a70: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
4a80: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
4a90: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
4aa0: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
4ab0: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
4ac0: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
4ad0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
4ae0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
4af0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
4b00: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
4b10: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
4b20: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
4b30: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
4b40: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
4b50: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
4b60: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
4b70: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
4b80: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
4b90: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
4ba0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
4bb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
4bc0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
4bd0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4be0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
4bf0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
4c00: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
4c10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
4c20: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4c30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4c40: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4c50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4c60: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
4c70: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
4c80: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
4c90: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
4ca0: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
4cb0: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
4cc0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
4cd0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
4ce0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
4cf0: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
4d00: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
4d10: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
4d20: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
4d30: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
4d40: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
4d50: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
4d60: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
4d70: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4d80: 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68  _ftruncate(int h
4d90: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
4da0: 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sz){.  int rc;. 
4db0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75   do{ rc = osFtru
4dc0: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
4dd0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
4de0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
4df0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4e10: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
4e20: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
4e30: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
4e40: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
4e50: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
4e60: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
4e70: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
4e80: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
4e90: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
4ea0: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
4eb0: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
4ec0: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
4ed0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
4ee0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
4ef0: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
4f00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
4f10: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
4f20: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
4f30: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
4f40: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
4f50: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
4f60: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
4f70: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
4f80: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
4f90: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
4fa0: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
4fb0: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
4fc0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
4fd0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
4fe0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
4ff0: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
5000: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
5010: 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20  sixError) {.#if 
5020: 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  0.  /* At one po
5030: 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61  int this code wa
5040: 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20  s not commented 
5050: 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20  out. In theory, 
5060: 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
5070: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
5080: 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75   hit, as this fu
5090: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
50a0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
50b0: 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e  er.  ** a lockin
50c0: 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  g-related functi
50d0: 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29  on (i.e. fcntl()
50e0: 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e  ) has returned n
50f0: 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a  on-zero with.  *
5100: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  * the value of e
5110: 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73  rrno as the firs
5120: 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63  t argument. Sinc
5130: 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e a system call 
5140: 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a  has failed,.  **
5150: 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65   errno should be
5160: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a   non-zero..  **.
5170: 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69    ** Despite thi
5180: 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c  s, if errno real
5190: 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73  ly is zero, we s
51a0: 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20  till don't want 
51b0: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
51c0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79  QLITE_OK. The sy
51d0: 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64  stem call failed
51e0: 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c  , and *some* SQL
51f0: 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64  ite error should
5200: 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61   be.  ** propaga
5210: 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ted back to the 
5220: 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69  caller. Commenti
5230: 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f  ng this branch o
5240: 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d  ut means errno==
5250: 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68  0.  ** will be h
5260: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64  andled by the "d
5270: 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65  efault:" case be
5280: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  low..  */.  case
5290: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
52a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
52b0: 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e  f..  case EAGAIN
52c0: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
52d0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
52e0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
52f0: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
5300: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
5310: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
5320: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
5330: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5340: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
5350: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5360: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
5370: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
5380: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5390: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
53a0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
53b0: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
53c0: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
53d0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
53e0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
53f0: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
5400: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
5410: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5420: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
5430: 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ..(sqliteIOErr =
5440: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
5450: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73 71 6c  NLOCK) || ..(sql
5460: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
5470: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
5480: 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f 45 72   ||..(sqliteIOEr
5490: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
54a0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
54b0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  OCK) ){.      re
54c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
54d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65  ;.    }.    /* e
54e0: 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  lse fall through
54f0: 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52 4d   */.  case EPERM
5500: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
5510: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a  LITE_PERM;.    .
5520: 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73 20    /* EDEADLK is 
5530: 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
5540: 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74 6c   a call to fcntl
5550: 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d 61  (F_SETLKW) is ma
5560: 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68 69  de. And.  ** thi
5570: 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20 6d  s module never m
5580: 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c 6c  akes such a call
5590: 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20 69  . And the code i
55a0: 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66 20  n SQLite itself 
55b0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74 68  .  ** asserts th
55c0: 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  at SQLITE_IOERR_
55d0: 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65 72  BLOCKED is never
55e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20 74   returned. For t
55f0: 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20 2a  hese reasons.  *
5600: 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20 61  * this case is a
5610: 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
5620: 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  t. If the system
5630: 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f 20   does set errno 
5640: 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a 2a  to EDEADLK,.  **
5650: 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51 4c   the default SQL
5660: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63 6f  ITE_IOERR_XXX co
5670: 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  de will be retur
5680: 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ned. */.#if 0.  
5690: 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20 20  case EDEADLK:.  
56a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56b0: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 23  IOERR_BLOCKED;.#
56c0: 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20 45  endif.    .#if E
56d0: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
56e0: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
56f0: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
5700: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
5710: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
5720: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5730: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
5740: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
5750: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
5760: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5770: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5780: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
5790: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
57a0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
57b0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
57c0: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
57d0: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
57e0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
57f0: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
5800: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
5810: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
5820: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
5830: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
5840: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
5850: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
5860: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
5870: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
5880: 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65  se ENOENT:.#ifde
5890: 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20 20  f ESTALE        
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64 65  ESTALE is not de
58c0: 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69 78  fined on Interix
58d0: 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61   systems */.  ca
58e0: 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69  se ESTALE:.#endi
58f0: 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53 3a  f.  case ENOSYS:
5900: 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73 68  .    /* these sh
5910: 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20 63  ould force the c
5920: 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74  lient to close t
5930: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63 6f  he file and reco
5940: 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20  nnect */.    .  
5950: 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65  default: .    re
5960: 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72  turn sqliteIOErr
5970: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a 2a  ;.  }.}..../****
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
59e0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
59f0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
5a00: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5a20: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
5a30: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
5a40: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
5a50: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
5a60: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
5a70: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
5a80: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
5a90: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
5aa0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
5ab0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
5ac0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
5ad0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
5ae0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
5af0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
5b00: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
5b10: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
5b20: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
5b30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
5b40: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
5b50: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
5b60: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
5b70: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
5b80: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5b90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
5ba0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
5bb0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
5bc0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
5bd0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
5be0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
5bf0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
5c00: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
5c10: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
5c20: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
5c30: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
5c40: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
5c50: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
5c60: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
5c70: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
5c80: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
5c90: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
5ca0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
5cb0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
5cc0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
5cd0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
5ce0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
5cf0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
5d00: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
5d10: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
5d20: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
5d30: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
5d40: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
5d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d60: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
5d70: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
5d80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5db0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
5dc0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
5dd0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
5de0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
5df0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
5e00: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
5e10: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
5e20: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
5e30: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
5e40: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
5e50: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
5e60: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
5e70: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
5e80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
5e90: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
5ea0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
5eb0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
5ec0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
5ed0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
5ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
5ef0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
5f00: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
5f10: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
5f20: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
5f30: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
5f40: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
5f50: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
5f60: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
5f70: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
5f80: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
5f90: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
5fa0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
5fb0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
5fc0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
5fd0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
5fe0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
5ff0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
6000: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
6010: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
6020: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
6030: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
6040: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
6050: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
6060: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
6070: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
6080: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
6090: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
60a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
60b0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
60c0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
60d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
60e0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
60f0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
6100: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
6110: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
6120: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6140: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
6150: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
6160: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
6170: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
6180: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
6190: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
61a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
61b0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
61c0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
61d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
61e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
6200: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
6210: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
6220: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
6230: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
6240: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
6250: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
6260: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
6270: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
6280: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
6290: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
62a0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
62b0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
62c0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
62d0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
62e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
62f0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
6300: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
6310: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
6320: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
6330: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
6340: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
6350: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
6360: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
6370: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
6380: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6390: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
63a0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
63b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
63c0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
63d0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
63e0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
63f0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
6400: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
6410: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
6420: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
6430: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
6440: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6450: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
6460: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
6470: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
6480: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
6490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
64b0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
64c0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
64d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
64e0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
64f0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
6500: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
6510: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
6520: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6530: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
6540: 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66   + (n+1) );.  if
6550: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
6560: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43  rn 0;.  pNew->zC
6570: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28  anonicalName = (
6580: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
6590: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
65a0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a  CanonicalName, z
65b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b  AbsoluteName, n+
65c0: 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b  1);.  n = vxwork
65d0: 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e  sSimplifyName(pN
65e0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
65f0: 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65  me, n);..  /* Se
6600: 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
6610: 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20  ting entry that 
6620: 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e  matching the can
6630: 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a  onical name..  *
6640: 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72  * If found, incr
6650: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
6660: 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65  nce count and re
6670: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6680: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74  o.  ** the exist
6690: 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a  ing file ID..  *
66a0: 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
66b0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e  ex();.  for(pCan
66c0: 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69  didate=vxworksFi
66d0: 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61  leList; pCandida
66e0: 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70  te; pCandidate=p
66f0: 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74  Candidate->pNext
6700: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64  ){.    if( pCand
6710: 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20  idate->nName==n 
6720: 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28  .     && memcmp(
6730: 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e  pCandidate->zCan
6740: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77  onicalName, pNew
6750: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
6760: 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  , n)==0.    ){. 
6770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6780: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
6790: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65   pCandidate->nRe
67a0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78  f++;.       unix
67b0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
67c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e       return pCan
67d0: 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  didate;.    }.  
67e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68  }..  /* No match
67f0: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20   was found.  We 
6800: 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20  will make a new 
6810: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65  file ID */.  pNe
6820: 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  w->nRef = 1;.  p
6830: 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a  New->nName = n;.
6840: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
6850: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
6860: 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  .  vxworksFileLi
6870: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69  st = pNew;.  uni
6880: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
6890: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
68a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
68b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
68c0: 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b  ount on a vxwork
68d0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
68e0: 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a   Free.** the obj
68f0: 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66  ect when the ref
6900: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
6910: 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  ches zero..*/.st
6920: 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b  atic void vxwork
6930: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73  sReleaseFileId(s
6940: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6950: 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69  eId *pId){.  uni
6960: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
6970: 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52   assert( pId->nR
6980: 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e  ef>0 );.  pId->n
6990: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64  Ref--;.  if( pId
69a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
69b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
69c0: 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20  ileId **pp;.    
69d0: 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46  for(pp=&vxworksF
69e0: 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20  ileList; *pp && 
69f0: 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26  *pp!=pId; pp = &
6a00: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b  ((*pp)->pNext)){
6a10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  }.    assert( *p
6a20: 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70  p==pId );.    *p
6a30: 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a  p = pId->pNext;.
6a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6a50: 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  (pId);.  }.  uni
6a60: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
6a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
6a80: 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  WORKS */./******
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
6aa0: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
6ab0: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
6ac0: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
6ad0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76  ****** Posix Adv
6ba0: 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  isory Locking **
6bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6bd0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
6be0: 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e  locks are broken
6bf0: 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53   by design.  ANS
6c00: 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39  I STD 1003.1 (19
6c10: 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36  96).** section 6
6c20: 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33  .5.2.2 lines 483
6c30: 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65   through 490 spe
6c40: 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61  cify that when a
6c50: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73   process.** sets
6c60: 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63   or clears a loc
6c70: 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f  k, that operatio
6c80: 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  n overrides any 
6c90: 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a  prior locks set.
6ca0: 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  ** by the same p
6cb0: 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73  rocess.  It does
6cc0: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
6cd0: 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73  say so, but this
6ce0: 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74   implies.** that
6cf0: 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f   it overrides lo
6d00: 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73  cks set by the s
6d10: 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e  ame process usin
6d20: 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  g a different.**
6d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6d40: 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
6d50: 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a   test case:.**.*
6d60: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20  *       int fd1 
6d70: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22  = open("./file1"
6d80: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
6d90: 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20  , 0644);.**     
6da0: 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e    int fd2 = open
6db0: 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44  ("./file2", O_RD
6dc0: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
6dd0: 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  );.**.** Suppose
6de0: 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66   ./file1 and ./f
6df0: 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20  ile2 are really 
6e00: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62  the same file (b
6e10: 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73  ecause.** one is
6e20: 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f   a hard or symbo
6e30: 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  lic link to the 
6e40: 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79  other) then if y
6e50: 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63  ou set.** an exc
6e60: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66  lusive lock on f
6e70: 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  d1, then try to 
6e80: 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  get an exclusive
6e90: 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c   lock.** on fd2,
6ea0: 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f   it works.  I wo
6eb0: 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65  uld have expecte
6ec0: 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63  d the second loc
6ed0: 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e  k to.** fail sin
6ee0: 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72  ce there was alr
6ef0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  eady a lock on t
6f00: 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66  he file due to f
6f10: 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73  d1..** But not s
6f20: 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c  o.  Since both l
6f30: 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74  ocks came from t
6f40: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c  he same process,
6f50: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f   the.** second o
6f60: 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72  verrides the fir
6f70: 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  st, even though 
6f80: 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66  they were on dif
6f90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
6fa0: 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
6fb0: 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66  d on different f
6fc0: 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a  ile names..**.**
6fd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
6fe0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
6ff0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
7000: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
7010: 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63  ccess.** among c
7020: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
7030: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
7040: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
7050: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
7060: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
7070: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
7080: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
7090: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
70a0: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
70b0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
70c0: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
70d0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
70e0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
70f0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
7100: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
7110: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
7120: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
7130: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
7140: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
7150: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
7160: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
7170: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7180: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
7190: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
71a0: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
71b0: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
71c0: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
71d0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
71e0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
71f0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
7200: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
7210: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
7220: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
7230: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
7240: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
7250: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
7260: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
7270: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
7280: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
7290: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
72a0: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
72b0: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
72c0: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
72d0: 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54  .**.** (Aside: T
72e0: 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20  he use of inode 
72f0: 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75  numbers as uniqu
7300: 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77  e IDs does not w
7310: 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ork on VxWorks..
7320: 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20  ** For VxWorks, 
7330: 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74  we have to use t
7340: 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75  he alternative u
7350: 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20  nique ID system 
7360: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f  based on.** cano
7370: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61  nical filename a
7380: 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  nd implemented i
7390: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64  n the previous d
73a0: 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20  ivision.).**.** 
73b0: 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  The sqlite3_file
73c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
73d0: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
73e0: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
73f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
7400: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
7410: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
7420: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
7430: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
7440: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
7450: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
7460: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
7470: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
7480: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
7490: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
74a0: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
74b0: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
74c0: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
74d0: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
74e0: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
74f0: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e  d twice, both un
7500: 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
7510: 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  s.** point to th
7520: 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73  e same locking s
7530: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c  tructure.  The l
7540: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
7550: 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65   keeps.** a refe
7560: 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20  rence count (so 
7570: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
7580: 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20  n to delete it) 
7590: 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66  and a "cnt".** f
75a0: 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20  ield that tells 
75b0: 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20  us its internal 
75c0: 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e  lock status.  cn
75d0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a  t==0 means the.*
75e0: 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  * file is unlock
75f0: 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61  ed.  cnt==-1 mea
7600: 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ns the file has 
7610: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7620: 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e  k..** cnt>0 mean
7630: 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20  s there are cnt 
7640: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20  shared locks on 
7650: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
7660: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  Any attempt to l
7670: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20  ock or unlock a 
7680: 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b  file first check
7690: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  s the locking.**
76a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
76b0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
76c0: 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76  call is only inv
76d0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a  oked to set a .*
76e0: 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20  * POSIX lock if 
76f0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  the internal loc
7700: 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  k structure tran
7710: 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a  sitions between.
7720: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20  ** a locked and 
7730: 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74  an unlocked stat
7740: 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69  e..**.** But wai
7750: 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65  t:  there are ye
7760: 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20  t more problems 
7770: 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73  with POSIX advis
7780: 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  ory locks..**.**
7790: 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   If you close a 
77a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
77b0: 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
77c0: 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c   file that has l
77d0: 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63  ocks,.** all loc
77e0: 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20  ks on that file 
77f0: 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62  that are owned b
7800: 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  y the current pr
7810: 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c  ocess are.** rel
7820: 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20  eased.  To work 
7830: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
7840: 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e  lem, each unixIn
7850: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  odeInfo object.*
7860: 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f  * maintains a co
7870: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
7880: 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63  r of pending loc
7890: 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e  ks on tha inode.
78a0: 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65  .** When an atte
78b0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
78c0: 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65  lose an unixFile
78d0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  , if there are.*
78e0: 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65  * other unixFile
78f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
7900: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
7910: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
7920: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
7930: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
7940: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
7950: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
7960: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
7970: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ear..** The unix
7980: 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74  InodeInfo struct
7990: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
79a0: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
79b0: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
79c0: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
79d0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
79e0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
79f0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
7a00: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
7a10: 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f  s..**.** Yet ano
7a20: 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c  ther problem:  L
7a30: 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e  inuxThreads do n
7a40: 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
7a50: 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a  h posix locks..*
7a60: 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20  *.** Many older 
7a70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75  versions of linu
7a80: 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54  x use the LinuxT
7a90: 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77  hreads library w
7aa0: 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70  hich is.** not p
7ab0: 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20  osix compliant. 
7ac0: 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65   Under LinuxThre
7ad0: 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61  ads, a lock crea
7ae0: 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a  ted by thread.**
7af0: 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64   A cannot be mod
7b00: 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64  ified or overrid
7b10: 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65  den by a differe
7b20: 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  nt thread B..** 
7b30: 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61  Only thread A ca
7b40: 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63  n modify the loc
7b50: 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61  k.  Locking beha
7b60: 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a  vior is correct.
7b70: 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61  ** if the applia
7b80: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65  tion uses the ne
7b90: 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78  wer Native Posix
7ba0: 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20   Thread Library 
7bb0: 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e  (NPTL).** on lin
7bc0: 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61  ux - with NPTL a
7bd0: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
7be0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
7bf0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
7c00: 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75  in thread B.  Bu
7c10: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  t there is no wa
7c20: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d  y to know at com
7c30: 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a  pile-time which.
7c40: 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62  ** threading lib
7c50: 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73  rary is being us
7c60: 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ed.  So there is
7c70: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
7c80: 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  at.** compile-ti
7c90: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7ca0: 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  t thread A can o
7cb0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e  verride locks on
7cc0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
7cd0: 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75  e has to do a ru
7ce0: 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20  n-time check to 
7cf0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68  discover the beh
7d00: 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20  avior of the.** 
7d10: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
7d20: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
7d30: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69  ed to support Li
7d40: 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74  nuxThreads.  But
7d50: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e   support for Lin
7d60: 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73  uxThreads.** was
7d70: 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69   dropped beginni
7d80: 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20  ng with version 
7d90: 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77  3.7.0.  SQLite w
7da0: 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77  ill still work w
7db0: 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65  ith.** LinuxThre
7dc0: 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61  ads provided tha
7dd0: 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e  t (1) there is n
7de0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7df0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
7e00: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7e10: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
7e20: 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74  cess and (2) dat
7e30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7e40: 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65  s.** do not move
7e50: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e   across threads.
7e60: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
7e70: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
7e80: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
7e90: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
7ea0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
7eb0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
7ec0: 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ar unixInodeInfo
7ed0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75   object..*/.stru
7ee0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a  ct unixFileId {.
7ef0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f10: 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a   Device number *
7f20: 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
7f30: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
7f40: 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f  sFileId *pId;  /
7f50: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
7f60: 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f   for vxworks. */
7f70: 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69  .#else.  ino_t i
7f80: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
7f90: 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75       /* Inode nu
7fa0: 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  mber */.#endif.}
7fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
7fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7fe0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
7ff0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
8000: 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e  ode.  Or, on Lin
8010: 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72 65  uxThreads, there
8020: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   is one of these
8030: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a   structures for.
8040: 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70  ** each inode op
8050: 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68 72  ened by each thr
8060: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ead..**.** A sin
8070: 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61  gle inode can ha
8080: 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ve multiple file
8090: 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f   descriptors, so
80a0: 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a   each unixFile.*
80b0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
80c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
80d0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
80e0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
80f0: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
8100: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
8110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
8120: 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67  nixFile pointing
8130: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
8140: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
8150: 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  {.  struct unixF
8160: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
8170: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75      /* The looku
8180: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  p key */.  int n
8190: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
81a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
81b0: 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c  mber of SHARED l
81c0: 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
81d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
81e0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f  leLock;        /
81f0: 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f  * One of SHARED_
8200: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
8210: 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e  OCK etc. */.  un
8220: 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f  signed char bPro
8230: 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a  cessLock;     /*
8240: 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72   An exclusive pr
8250: 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65  ocess lock is he
8260: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ld */.  int nRef
8270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8290: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
82a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
82b0: 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
82c0: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
82d0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
82e0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
82f0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65   with this inode
8300: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b   */.  int nLock;
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8330: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
8340: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
8350: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
8360: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
8370: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
8380: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
8390: 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  se */.  unixInod
83a0: 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20  eInfo *pNext;   
83b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
83c0: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
83d0: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Info objects */.
83e0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
83f0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
8400: 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75    /*    .... dou
8410: 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69  bly linked */.#i
8420: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8430: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
8440: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8450: 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20 20  ng sharedByte;  
8460: 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c  /* for AFP simul
8470: 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b  ated shared lock
8480: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
8490: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f  S_VXWORKS.  sem_
84a0: 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20  t *pSem;        
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84c0: 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70  amed POSIX semap
84d0: 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61  hore */.  char a
84e0: 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  SemName[MAX_PATH
84f0: 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d  NAME+2];  /* Nam
8500: 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68  e of that semaph
8510: 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ore */.#endif.};
8520: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20  ../*.** A lists 
8530: 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65  of all unixInode
8540: 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  Info objects..*/
8550: 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64  .static unixInod
8560: 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74  eInfo *inodeList
8570: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   = 0;../*.**.** 
8580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
8590: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29  unixLogError_x()
85a0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
85b0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
85c0: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
85d0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
85e0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
85f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8600: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
8610: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
8620: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
8630: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
8640: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
8650: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
8660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
8670: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
8680: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
8690: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
86a0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
86b0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
86c0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
86d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
86e0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
86f0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
8700: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
8710: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
8720: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
8730: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
8740: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
8750: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
8760: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
8770: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
8780: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
8790: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
87a0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
87b0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
87c0: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
87d0: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 74 68 65  en") and the the
87e0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
87f0: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
8800: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
8810: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
8820: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
8830: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
8840: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
8850: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
8860: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
8870: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
88a0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
88b0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
88c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
88d0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
88e0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
88f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8900: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
8910: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
8920: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
8930: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
8940: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
8950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
8960: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
8970: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
8980: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
8990: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
89c0: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
89d0: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
89e0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
8a00: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
8a10: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
8a20: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
8a30: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
8a40: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
8a50: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
8a60: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
8a70: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
8a80: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
8a90: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
8aa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
8ab0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
8ac0: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
8ad0: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
8ae0: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
8af0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
8b00: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
8b10: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
8b20: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
8b30: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
8b40: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
8b50: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
8b60: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
8b70: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
8b80: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
8b90: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
8ba0: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
8bb0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
8bc0: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
8bd0: 74 68 65 20 74 68 65 20 47 4e 55 20 76 65 72 73  the the GNU vers
8be0: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
8bf0: 72 28 29 20 74 68 61 74 20 0a 20 20 2a 2a 20 72  r() that .  ** r
8c00: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
8c10: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
8c20: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
8c30: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
8c40: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
8c50: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
8c60: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
8c70: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
8c80: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
8c90: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
8ca0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
8cb0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
8cc0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
8cd0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
8ce0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
8cf0: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
8d00: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
8d10: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
8d20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8d30: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
8d40: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
8d50: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
8d60: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
8d70: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
8d80: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
8d90: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
8da0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8db0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
8dc0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
8dd0: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
8de0: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
8df0: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
8e00: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
8e10: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
8e20: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
8e30: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
8e40: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
8e50: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
8e60: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
8e70: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
8e80: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
8e90: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
8ea0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
8eb0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
8ec0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
8ed0: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
8ee0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
8ef0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
8f00: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
8f10: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
8f20: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
8f30: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
8f40: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
8f50: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
8f60: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
8f70: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
8f80: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
8f90: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
8fa0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
8fb0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
8fc0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
8fd0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
8fe0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
8ff0: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
9000: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
9010: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
9020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
9030: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
9040: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
9050: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
9060: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
9070: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
9080: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
9090: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
90a0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
90b0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
90c0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
90d0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
90e0: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
90f0: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
9100: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
9110: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
9120: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9130: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
9140: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
9150: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
9160: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
9170: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
9180: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9190: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
91a0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
91b0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
91c0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
91d0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
91e0: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
91f0: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
9200: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9210: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
9220: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
9230: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
9240: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
9250: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
9260: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
9270: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
9280: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
92b0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
92c0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
92d0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
92e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
92f0: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
9300: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
9310: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
9320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
9330: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
9340: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
9350: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9360: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
9370: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
9380: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
9390: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
93a0: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
93b0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
93c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
93d0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
93e0: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
93f0: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
9400: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
9410: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
9420: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
9430: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
9440: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
9450: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
9460: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
9470: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
9480: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
9490: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
94a0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
94b0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
94c0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
94d0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
94e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
94f0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
9500: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
9510: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
9520: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
9530: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
9540: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
9550: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
9560: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
9570: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
9580: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
9590: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
95a0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
95b0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
95c0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
95d0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
95e0: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
95f0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
9600: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
9610: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9620: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
9630: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
9640: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
9650: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
9660: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
9670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
9690: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
96a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
96b0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
96c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
96d0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
96e0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
96f0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
9700: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
9710: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
9720: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
9730: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
9740: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9760: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
9770: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
9780: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
9790: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
97a0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
97b0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
97c0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
97d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
97e0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
97f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
9800: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
9810: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
9820: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
9830: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
9840: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
9850: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
9860: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9870: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
9880: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
9890: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
98a0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
98b0: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
98c0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
98d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
98e0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
98f0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9910: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
9920: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
9930: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
9940: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
9950: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
9960: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
9970: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9980: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
9990: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99b0: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
99c0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
99d0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
9a00: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
9a10: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
9a20: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
9a30: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
9a40: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
9a50: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
9a60: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
9a80: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
9a90: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
9aa0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
9ab0: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
9ac0: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
9ad0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
9ae0: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
9af0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
9b00: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
9b10: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
9b20: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
9b30: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
9b40: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
9b50: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
9b60: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9b70: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
9b80: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
9b90: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
9ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9bb0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9bc0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65  o = errno;.#ifde
9bd0: 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20  f EOVERFLOW.    
9be0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
9bf0: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
9c00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9c10: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
9c20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c30: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
9c40: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
9c50: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
9c60: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
9c70: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
9c80: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
9c90: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
9ca0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
9cb0: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
9cc0: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
9cd0: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
9ce0: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
9cf0: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
9d00: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
9d10: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
9d20: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
9d30: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
9d40: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
9d50: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
9d60: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
9d70: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9d80: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
9d90: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
9da0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
9db0: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
9dc0: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
9dd0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
9de0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
9df0: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
9e00: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
9e10: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
9e20: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
9e30: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
9e40: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
9e50: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
9e60: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
9e70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
9e80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
9e90: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
9ea0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
9eb0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
9ec0: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
9ed0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
9ee0: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
9ef0: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
9f00: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
9f10: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
9f20: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
9f30: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
9f40: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
9f50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9f60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
9f70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9f80: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
9f90: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
9fa0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
9fb0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
9fc0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
9fd0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
9fe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9ff0: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
a000: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
a010: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
a020: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
a030: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
a040: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
a050: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
a060: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
a070: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
a080: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
a090: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
a0a0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
a0b0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
a0c0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
a0d0: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
a0e0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
a0f0: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
a100: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
a110: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
a120: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
a130: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
a140: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
a150: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
a160: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
a170: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
a180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
a1a0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
a1b0: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
a1c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
a1d0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
a1e0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
a1f0: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
a200: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
a210: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
a220: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
a230: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
a240: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
a250: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
a260: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a270: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
a280: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
a290: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
a2a0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
a2b0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
a2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a2d0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
a2e0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
a2f0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
a300: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
a310: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
a320: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
a330: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
a340: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
a350: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
a360: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
a370: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
a380: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
a390: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
a3a0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
a3b0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
a3c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
a3d0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
a3e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
a3f0: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
a400: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
a410: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
a420: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
a430: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
a440: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
a450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a460: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
a470: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a480: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a490: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
a4a0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
a4b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a4c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
a4d0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
a4e0: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
a4f0: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
a500: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
a510: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
a520: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
a530: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
a540: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
a550: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
a560: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
a570: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
a580: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
a590: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
a5a0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
a5b0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
a5c0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
a5d0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
a5e0: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
a5f0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
a600: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
a610: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
a620: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
a630: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
a640: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
a650: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a660: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
a670: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
a680: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
a690: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
a6a0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
a6b0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
a6c0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a6d0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
a6e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a6f0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
a700: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20  ESERVEDLOCK;.   
a710: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
a720: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
a730: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
a740: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
a750: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
a760: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
a770: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
a780: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a790: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
a7a0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
a7b0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
a7c0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
a7d0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
a7e0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
a7f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a800: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
a810: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
a820: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
a830: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
a840: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
a850: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
a860: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
a870: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
a880: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
a890: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
a8a0: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
a8b0: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
a8c0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
a8d0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
a8e0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
a8f0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a900: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
a910: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
a920: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
a930: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
a940: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
a950: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
a960: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
a970: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
a980: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
a990: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
a9a0: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
a9b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a9c0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
a9d0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
a9e0: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
a9f0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
aa00: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
aa10: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
aa20: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
aa30: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
aa40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
aa50: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
aa60: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
aa70: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
aa80: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
aa90: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
aaa0: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
aab0: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
aac0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
aad0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
aae0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
aaf0: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
ab00: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
ab10: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
ab20: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
ab30: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
ab40: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
ab50: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
ab60: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ab80: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
ab90: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
aba0: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
abb0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
abc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
abd0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
abe0: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
abf0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
ac00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ac10: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
ac20: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
ac30: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45  ags & UNIXFILE_E
ac40: 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64  XCL)!=0 || pInod
ac50: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29  e->bProcessLock)
ac60: 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  .   && ((pFile->
ac70: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
ac80: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29  FILE_RDONLY)==0)
ac90: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  .  ){.    if( pI
aca0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
acb0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
acc0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
acd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ace0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
acf0: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
ad00: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ad10: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
ad20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ad30: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
ad40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
ad50: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
ad60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
ad70: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
ad80: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
ad90: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
adb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
adc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
add0: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
ade0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
adf0: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
ae00: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
ae10: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ae20: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
ae30: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
ae40: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
ae50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ae60: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
ae70: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
ae80: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
ae90: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
aea0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
aeb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
aec0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
aed0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
aee0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
aef0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
af00: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
af10: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
af20: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
af30: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
af40: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
af50: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
af60: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
af70: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
af80: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
af90: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
afa0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
afb0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
afc0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
afd0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
afe0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
aff0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
b000: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
b010: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
b020: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
b030: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
b040: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
b050: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
b060: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
b070: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
b080: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
b090: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
b0a0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
b0b0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
b0c0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
b0d0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
b0e0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
b0f0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
b100: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
b110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b120: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
b130: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
b140: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
b150: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
b160: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
b170: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
b180: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
b190: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b1a0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
b1b0: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
b1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
b1d0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
b1e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
b1f0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
b200: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
b210: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
b220: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
b230: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
b240: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
b250: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
b260: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
b270: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
b280: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
b290: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
b2a0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
b2b0: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
b2c0: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
b2d0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
b2e0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
b2f0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
b300: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
b310: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
b320: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
b330: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
b340: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
b350: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
b360: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
b370: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
b380: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
b390: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
b3a0: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
b3b0: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
b3c0: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
b3d0: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
b3e0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
b3f0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
b400: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
b410: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
b420: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
b430: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
b440: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
b450: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
b460: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
b470: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
b480: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
b490: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
b4a0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
b4b0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
b4c0: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
b4d0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
b4e0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
b4f0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
b500: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
b510: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
b520: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
b530: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
b540: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
b550: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
b560: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
b570: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
b580: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
b590: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
b5a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
b5b0: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
b5c0: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
b5d0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
b5e0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
b5f0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
b600: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
b610: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
b620: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
b630: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
b640: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
b650: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
b660: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
b670: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
b680: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
b690: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
b6a0: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
b6b0: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
b6c0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
b6d0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
b6e0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
b6f0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
b700: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
b710: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
b720: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
b730: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
b740: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
b750: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
b760: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
b770: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
b780: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
b790: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
b7a0: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
b7b0: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
b7c0: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
b7d0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
b7e0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
b7f0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
b800: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
b810: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
b820: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
b830: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
b840: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
b850: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
b860: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
b870: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
b880: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
b890: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
b8a0: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
b8b0: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
b8c0: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
b8d0: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
b8e0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
b8f0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
b900: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
b910: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
b920: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
b930: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
b940: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
b950: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
b960: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
b970: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
b980: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
b990: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
b9a0: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
b9b0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
b9c0: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
b9d0: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
b9e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
b9f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ba00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
ba10: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ba20: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
ba30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ba40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ba50: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
ba60: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
ba70: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
ba80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ba90: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
baa0: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
bab0: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
bac0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
bad0: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
bae0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
baf0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
bb00: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
bb10: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
bb20: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
bb30: 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
bb40: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
bb50: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
bb60: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
bb70: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
bb80: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
bb90: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
bba0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
bbb0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
bbc0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
bbd0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
bbe0: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
bbf0: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
bc00: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
bc10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
bc20: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
bc30: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
bc40: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
bc50: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
bc60: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
bc70: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
bc80: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
bc90: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
bca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bcb0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
bcc0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
bcd0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
bce0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
bcf0: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
bd00: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
bd10: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
bd20: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
bd30: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
bd40: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
bd50: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
bd60: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
bd70: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
bd80: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
bd90: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
bda0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
bdb0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
bdc0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
bdd0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
bde0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
bdf0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
be00: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
be10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
be20: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
be30: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
be40: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
be50: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
be60: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
be70: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
be80: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
be90: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
bea0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
beb0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
bec0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
bed0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
bee0: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
bef0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
bf00: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
bf10: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
bf20: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
bf30: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
bf40: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
bf50: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
bf60: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
bf70: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
bf80: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
bf90: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
bfa0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
bfb0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
bfc0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
bfd0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
bfe0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
bff0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
c000: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c010: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
c020: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
c030: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
c040: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
c050: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
c060: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
c070: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
c080: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
c090: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
c0a0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
c0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
c0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
c0d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c0e0: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
c0f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
c100: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c110: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c120: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
c130: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
c140: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
c150: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
c160: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c170: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c180: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c190: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
c1a0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
c1b0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
c1c0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
c1d0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
c1e0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c1f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
c200: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
c210: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
c220: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
c230: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
c240: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
c250: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
c260: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
c270: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
c280: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
c290: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
c2a0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
c2b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
c2c0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
c2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c2e0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
c2f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
c300: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
c310: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
c320: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
c330: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
c340: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
c350: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
c360: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c370: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
c380: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
c390: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
c3a0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
c3b0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
c3c0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
c3d0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
c3e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c3f0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
c400: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
c410: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
c420: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c430: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c440: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
c450: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c470: 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
c480: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
c490: 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
c4a0: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
c4b0: 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
c4c0: 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
c4d0: 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
c4e0: 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
c4f0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
c500: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
c510: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
c520: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
c530: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
c540: 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
c550: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
c560: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
c570: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
c580: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
c590: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
c5a0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
c5b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c5c0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c5d0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
c5e0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
c5f0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
c600: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
c610: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
c620: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
c630: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
c640: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
c650: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
c660: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  _LOCK);.    }.. 
c670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
c680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
c690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
c6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
c6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
c6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
c6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
c6f0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
c700: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20  File, &lock) && 
c710: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c720: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
c730: 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
c740: 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
c750: 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
c760: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
c770: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
c780: 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d  R_UNLOCK; .    }
c790: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
c7a0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c7b0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c7c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
c7d0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
c7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c7f0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
c800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
c810: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
c820: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
c830: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
c840: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
c850: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
c860: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c870: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
c880: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
c890: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
c8a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
c8b0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
c8c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
c8d0: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
c8e0: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
c8f0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
c900: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
c910: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
c920: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c930: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
c940: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
c950: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
c960: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
c970: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
c980: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
c990: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
c9a0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
c9b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
c9c0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
c9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c9e0: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
c9f0: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
ca00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ca10: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
ca20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
ca30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
ca40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
ca50: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
ca60: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ca70: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
ca80: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ca90: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
caa0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
cab0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
cac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
cad0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
cae0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
caf0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
cb00: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
cb10: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
cb20: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
cb30: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
cb40: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
cb50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
cb60: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
cb70: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
cb80: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
cb90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cba0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
cbb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
cbc0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
cbd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cbe0: 20 20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    ..#ifndef NDEB
cbf0: 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  UG.  /* Set up t
cc00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63  he transaction-c
cc10: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68  ounter change ch
cc20: 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65  ecking flags whe
cc30: 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f  n.  ** transitio
cc40: 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52  ning from a SHAR
cc50: 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44  ED to a RESERVED
cc60: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e   lock.  The chan
cc70: 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41  ge.  ** from SHA
cc80: 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20  RED to RESERVED 
cc90: 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e  marks the beginn
cca0: 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a  ing of a normal.
ccb0: 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61    ** write opera
ccc0: 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20  tion (not a hot 
ccd0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
cce0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  )..  */.  if( rc
ccf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
cd00: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
cd10: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  ck<=SHARED_LOCK.
cd20: 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d     && eFileLock=
cd30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20  =RESERVED_LOCK. 
cd40: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74   ){.    pFile->t
cd50: 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30  ransCntrChng = 0
cd60: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55  ;.    pFile->dbU
cd70: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  pdate = 0;.    p
cd80: 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
cd90: 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e  ite = 1;.  }.#en
cda0: 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d  dif...  if( rc==
cdb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cdc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cdd0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
cde0: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
cdf0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
ce00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
ce10: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
ce20: 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
ce30: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ce40: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
ce50: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ce60: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
ce70: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c  LOCK;.  }..end_l
ce80: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
ce90: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
cea0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
ceb0: 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c  %s %s (unix)\n",
cec0: 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
ced0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
cee0: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
cef0: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
cf00: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
cf10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cf20: 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64  * Add the file d
cf30: 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62  escriptor used b
cf40: 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46  y file handle pF
cf50: 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ile to the corre
cf60: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75  sponding.** pUnu
cf70: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  sed list..*/.sta
cf80: 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64  tic void setPend
cf90: 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a  ingFd(unixFile *
cfa0: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
cfb0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
cfc0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
cfd0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
cfe0: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
cff0: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
d000: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
d010: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
d020: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
d030: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
d040: 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b  le->pUnused = 0;
d050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
d060: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
d070: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
d080: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
d090: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
d0a0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
d0b0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
d0c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
d0d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
d0e0: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
d0f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d100: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
d110: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
d120: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
d130: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
d140: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d150: 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
d160: 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
d170: 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
d180: 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
d190: 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
d1a0: 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
d1b0: 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
d1c0: 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
d1d0: 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
d1e0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
d1f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
d200: 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
d210: 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
d220: 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
d230: 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
d240: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
d250: 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
d260: 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
d270: 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
d280: 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
d290: 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
d2a0: 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
d2b0: 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
d2c0: 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
d2d0: 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
d2e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
d2f0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
d300: 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
d310: 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
d320: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
d330: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
d340: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
d350: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
d360: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
d370: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d380: 20 69 6e 74 20 68 3b 0a 0a 20 20 61 73 73 65 72   int h;..  asser
d390: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
d3a0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
d3b0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
d3c0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
d3d0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
d3e0: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
d3f0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d400: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
d410: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
d420: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
d430: 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74 70 69  red,.      getpi
d440: 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  d()));..  assert
d450: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
d460: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
d470: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
d480: 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
d490: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d4a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
d4b0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
d4c0: 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20   h = pFile->h;. 
d4d0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
d4e0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
d4f0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
d500: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
d510: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
d520: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d530: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
d540: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
d550: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
d560: 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
d570: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d580: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d590: 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
d5a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
d5b0: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69 66  rBenign(0);..#if
d5c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
d5d0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
d5e0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
d5f0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
d600: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
d610: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
d620: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
d630: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
d640: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
d650: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
d660: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
d670: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
d680: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
d690: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
d6a0: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
d6b0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
d6c0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
d6d0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
d6e0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
d6f0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
d700: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
d710: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
d720: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
d730: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
d740: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
d750: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
d760: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
d770: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
d780: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
d790: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
d7a0: 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72 74  #if 0.    assert
d7b0: 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
d7c0: 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
d7d0: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55     || pFile->dbU
d7e0: 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  pdate==0.       
d7f0: 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
d800: 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
d810: 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c 65  #endif.    pFile
d820: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
d830: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
d840: 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   /* downgrading 
d850: 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
d860: 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73   on NFS involves
d870: 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72   clearing the wr
d880: 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  ite lock.    ** 
d890: 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68  before establish
d8a0: 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b  ing the readlock
d8b0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61   - to avoid a ra
d8c0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20  ce condition we 
d8d0: 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a  downgrade.    **
d8e0: 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62   the lock in 2 b
d8f0: 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70  locks, so that p
d900: 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
d910: 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64   will be covered
d920: 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72   by a .    ** wr
d930: 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74  ite lock until t
d940: 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72  he rest is cover
d950: 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63  ed by a read loc
d960: 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20  k:.    **  1:   
d970: 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20  [WWWWW].    **  
d980: 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20  2:   [....W].   
d990: 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57   **  3:   [RRRRW
d9a0: 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b  ].    **  4:   [
d9b0: 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20  RRRR.].    */.  
d9c0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d9d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d9e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
d9f0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
da00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
da10: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
da20: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
da30: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
da40: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
da50: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
da60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
da70: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
da80: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
da90: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
daa0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
dac0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
dad0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
dae0: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
daf0: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
db00: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
db10: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
db20: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
db30: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
db40: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
db50: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
db60: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
db70: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
db80: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
db90: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
dba0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
dbb0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
dbc0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dbd0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
dbe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
dbf0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dc00: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
dc10: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
dc20: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
dc30: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
dc40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dc50: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
dc60: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
dc70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
dc90: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
dca0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
dcb0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
dcc0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
dcd0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
dce0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
dcf0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dd00: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
dd10: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
dd30: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
dd40: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
dd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
dd60: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
dd70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dd80: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
dd90: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
dda0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ddb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
ddc0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
ddd0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dde0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ddf0: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
de00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
de20: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
de30: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
de40: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
de50: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
de60: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
de70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
de80: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
de90: 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
dea0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
deb0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
dec0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
ded0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
dee0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
def0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
df00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
df10: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
df20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
df30: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  CK;.          if
df40: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
df50: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
df60: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
df70: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
dfa0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
dfb0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
dfc0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
dfd0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
dfe0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
dff0: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
e000: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
e010: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
e020: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e030: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e040: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
e050: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
e060: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
e070: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e080: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
e090: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e0a0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e0c0: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
e0d0: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
e0e0: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
e0f0: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
e100: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
e110: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
e120: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
e130: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
e140: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
e150: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
e160: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
e170: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
e180: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
e190: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
e1a0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
e1b0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
e1c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e1d0: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
e1e0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
e1f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
e200: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
e210: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
e220: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
e230: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
e240: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
e250: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
e260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
e270: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
e280: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
e290: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e2a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e2b0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e2c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e2d0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
e2e0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e2f0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e300: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e310: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
e320: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
e330: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
e340: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
e350: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
e360: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
e370: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e380: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e390: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
e3a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
e3b0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
e3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
e3d0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
e3e0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  NLOCK;.      pFi
e3f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
e400: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74  errno;.      got
e410: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e420: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
e430: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
e440: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
e450: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
e460: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
e470: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
e480: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
e490: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
e4a0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
e4b0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
e4c0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
e4d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e4e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
e4f0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
e500: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
e510: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
e520: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e530: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
e540: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
e550: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
e560: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e570: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
e580: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e590: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
e5a0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5b0: 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
e5c0: 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
e5d0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
e5f0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e600: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
e610: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
e620: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
e630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e650: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
e660: 09 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e  .pFile->lastErrn
e670: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e680: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e690: 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
e6a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
e6b0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
e6c0: 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
e6d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
e6e0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
e6f0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
e700: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
e710: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
e720: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
e730: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
e740: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
e750: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
e760: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
e770: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
e780: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
e790: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
e7a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
e7b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
e7c0: 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
e7d0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
e7e0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
e7f0: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
e800: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
e810: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
e820: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
e830: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
e840: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
e850: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
e860: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
e870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
e880: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e890: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e8a0: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e8b0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e8c0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e8d0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e8e0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e8f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e900: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e910: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e920: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e930: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e940: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e950: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e960: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e970: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
e980: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
e990: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e9a0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
e9b0: 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
e9c0: 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
e9d0: 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ck, 0);.}../*.**
e9e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
e9f0: 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74  erforms the part
ea00: 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20  s of the "close 
ea10: 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20  file" operation 
ea20: 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  .** common to al
ea30: 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65  l locking scheme
ea40: 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65  s. It closes the
ea50: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66   directory and f
ea60: 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20  ile.** handles, 
ea70: 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69  if they are vali
ea80: 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20  d, and sets all 
ea90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e  fields of the un
eaa0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
eab0: 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  ure to 0..**.** 
eac0: 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65  It is *not* nece
ead0: 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  ssary to hold th
eae0: 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69  e mutex when thi
eaf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
eb00: 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20  led,.** even on 
eb10: 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65  VxWorks.  A mute
eb20: 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72  x will be acquir
eb30: 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79  ed on VxWorks by
eb40: 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52   the.** vxworksR
eb50: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72  eleaseFileId() r
eb60: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
eb70: 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46  c int closeUnixF
eb80: 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ile(sqlite3_file
eb90: 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c   *id){.  unixFil
eba0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
ebb0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
ebc0: 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
ebd0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
ebe0: 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
ebf0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
ec00: 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
ec10: 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
ec20: 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
ec30: 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
ec40: 69 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b  ile->isDelete ){
ec50: 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
ec60: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
ec70: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
ec80: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
ec90: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
eca0: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
ecb0: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
ecc0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
ecd0: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
ece0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
ecf0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
ed00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
ed10: 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
ed20: 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
ed30: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
ed40: 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ed60: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
ed70: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ed80: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
ed90: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
edb0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
edc0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
edd0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
ede0: 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
edf0: 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
ee00: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
ee10: 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
ee20: 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
ee30: 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
ee40: 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
ee50: 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
ee60: 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
ee70: 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
ee80: 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
ee90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
eea0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
eeb0: 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
eec0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
eed0: 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
eee0: 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
eef0: 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
ef00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
ef10: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
ef20: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
ef30: 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
ef40: 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
ef50: 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
ef60: 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
ef70: 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
ef80: 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
ef90: 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
efa0: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
efb0: 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
efc0: 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
efd0: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
efe0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
eff0: 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
f000: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
f010: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f020: 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
f030: 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
f040: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
f050: 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
f060: 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
f070: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
f080: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f090: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
f0a0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
f0b0: 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
f0c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0e0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f180: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
f190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1a0: 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
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 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
f1e0: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
f1f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
f200: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
f210: 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
f220: 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
f230: 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
f240: 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
f250: 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
f260: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
f270: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
f280: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
f290: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
f2a0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
f2b0: 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
f2c0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
f2d0: 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
f2e0: 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
f2f0: 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
f300: 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
f310: 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
f320: 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
f330: 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
f340: 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
f350: 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
f360: 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
f370: 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
f380: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
f390: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
f3a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f3b0: 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
f3c0: 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
f3d0: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
f3e0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
f3f0: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
f400: 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
f410: 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
f420: 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
f430: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
f440: 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
f450: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
f460: 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
f470: 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
f480: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
f490: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
f4a0: 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
f4b0: 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
f4c0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
f4d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
f4e0: 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
f4f0: 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
f500: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
f510: 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
f520: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
f530: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
f540: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
f550: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
f560: 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
f570: 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
f580: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
f590: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
f5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f5b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
f5c0: 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
f5d0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
f5e0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
f5f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
f600: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
f610: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
f620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f630: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
f640: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f650: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
f660: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f670: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
f680: 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
f690: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
f6a0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
f6b0: 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
f6c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
f6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f730: 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
f740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f780: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
f790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
f7a0: 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
f7b0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
f7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7d0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
f7e0: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
f7f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
f800: 65 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  es the existance
f810: 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
f820: 6b 0a 2a 2a 20 66 69 6c 65 73 20 69 6e 20 6f 72  k.** files in or
f830: 64 65 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  der to control a
f840: 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
f850: 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
f860: 6b 73 20 6f 6e 20 6a 75 73 74 0a 2a 2a 20 61 62  ks on just.** ab
f870: 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
f880: 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
f890: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
f8a0: 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
f8b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
f8c0: 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
f8d0: 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
f8e0: 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
f8f0: 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
f900: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
f910: 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
f920: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
f930: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
f940: 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
f950: 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
f960: 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
f970: 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
f980: 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
f990: 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
f9a0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
f9b0: 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
f9c0: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
f9d0: 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
f9e0: 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
f9f0: 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
fa00: 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
fa10: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
fa20: 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
fa30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
fa40: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
fa50: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
fa60: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
fa70: 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68   directory as th
fa80: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
fa90: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
faa0: 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
fab0: 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
fac0: 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
fad0: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 6c  existance of a l
fae0: 6f 63 6b 20 66 69 6c 65 20 69 6d 70 6c 69 65 73  ock file implies
faf0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
fb00: 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 6c  ck.  All other l
fb10: 6f 63 6b 0a 2a 2a 20 74 79 70 65 73 20 28 53 48  ock.** types (SH
fb20: 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
fb30: 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
fb40: 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
fb50: 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
fb60: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
fb70: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
fb80: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
fb90: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
fba0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c   the.** lock fil
fbb0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  e..*/.#define DO
fbc0: 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
fbd0: 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
fbe0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
fbf0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
fc00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
fc10: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
fc20: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
fc30: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
fc40: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
fc50: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
fc60: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
fc70: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
fc80: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
fc90: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
fca0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
fcb0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
fcc0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
fcd0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
fce0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fcf0: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
fd00: 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
fd10: 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
fd20: 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
fd30: 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
fd40: 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
fd50: 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
fd60: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
fd70: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
fd80: 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
fd90: 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
fda0: 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
fdb0: 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
fdc0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
fdd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
fde0: 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
fdf0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
fe00: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
fe10: 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
fe20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fe30: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
fe40: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
fe50: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fe60: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
fe70: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
fe80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
fe90: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
fea0: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
feb0: 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
fec0: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
fed0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
fee0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
fef0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
ff00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
ff10: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ff20: 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
ff30: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
ff40: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
ff50: 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
ff60: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
ff70: 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
ff80: 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
ff90: 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
ffa0: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
ffb0: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
ffc0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
ffd0: 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
ffe0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
fff0: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
10000 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10010 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
10020 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
10030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10040 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
10050 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
10060 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
10070 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
10080 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
10090 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
100a0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
100b0 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
100c0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
100d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
100e0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
100f0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
10100 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
10110 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
10120 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
10130 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10140 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
10150 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
10160 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
10170 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
10180 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
10190 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
101a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
101b0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
101c0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
101d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
101e0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
101f0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
10200 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
10210 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
10220 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
10230 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
10240 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
10250 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
10260 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
10270 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
10280 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
10290 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
102a0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
102b0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
102c0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
102d0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
102e0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
102f0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
10300 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
10310 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
10320 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
10330 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
10340 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
10350 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
10360 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
10370 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
10380 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
10390 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
103a0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
103b0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
103c0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
103d0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
103e0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
103f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
10400 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
10410 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
10420 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
10430 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
10440 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
10450 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
10460 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
10470 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
10480 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10490 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
104a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
104b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
104c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
104d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
104e0 6e 74 20 66 64 3b 0a 20 20 63 68 61 72 20 2a 7a  nt fd;.  char *z
104f0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
10500 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
10510 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
10520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10530 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
10540 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
10550 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
10560 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
10570 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
10580 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
10590 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
105a0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
105b0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
105c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
105d0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
105e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
105f0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
10600 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
10610 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
10620 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
10630 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
10640 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
10650 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
10660 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
10670 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
10680 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
10690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
106a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
106b0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
106c0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66  sive lock */.  f
106d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
106e0 7a 4c 6f 63 6b 46 69 6c 65 2c 4f 5f 52 44 4f 4e  zLockFile,O_RDON
106f0 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  LY|O_CREAT|O_EXC
10700 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66 28 20 66  L,0600);.  if( f
10710 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  d<0 ){.    /* fa
10720 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
10730 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
10740 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
10750 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
10760 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  ock */.    int t
10770 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10780 20 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d     if( EEXIST ==
10790 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
107a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
107b0 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
107c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107d0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
107e0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
107f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
10800 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
10810 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10820 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
10830 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
10840 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
10850 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10860 20 20 7d 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c    } .  robust_cl
10870 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
10880 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 0a 20 20 2f  _LINE__);.  .  /
10890 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
108a0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
108b0 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
108c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
108d0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
108e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
108f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
10900 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
10910 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
10920 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
10930 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
10940 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
10950 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
10960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
10970 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
10980 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10990 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
109a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
109b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
109c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
109d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
109e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
109f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
10a00 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
10a10 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
10a20 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
10a30 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
10a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10a50 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
10a60 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
10a70 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10a80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10a90 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10aa0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10ab0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
10ac0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10ad0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
10ae0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
10af0 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
10b00 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
10b10 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20   eFileLock,..   
10b20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10b30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
10b40 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
10b50 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
10b60 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
10b70 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
10b80 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
10b90 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
10ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
10bc0 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65   /* To downgrade
10bd0 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70   to shared, simp
10be0 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  ly update our in
10bf0 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66  ternal notion of
10c00 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73   the.  ** lock s
10c10 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74  tate.  No need t
10c20 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20  o mess with the 
10c30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
10c40 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  */.  if( eFileLo
10c50 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
10c60 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
10c70 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
10c80 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
10c90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10ca0 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c  .  .  /* To full
10cb0 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  y unlock the dat
10cc0 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68  abase, delete th
10cd0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  e lock file */. 
10ce0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
10cf0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  ck==NO_LOCK );. 
10d00 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c   if( osUnlink(zL
10d10 6f 63 6b 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  ockFile) ){.    
10d20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
10d30 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
10d40 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 4e 4f 45  no;.    if( ENOE
10d50 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  NT != tErrno ){.
10d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10d70 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
10d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
10d90 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
10da0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10db0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
10dc0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  no;.    }.    re
10dd0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
10de0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10df0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
10e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10e10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10e20 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72   file.  Make sur
10e30 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
10e40 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66  een released bef
10e50 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a  ore closing..*/.
10e60 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10e70 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
10e80 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
10e90 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 20 29  t rc;.  if( id )
10ea0 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
10eb0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10ec0 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f  e*)id;.    dotlo
10ed0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
10ee0 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74  LOCK);.    sqlit
10ef0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
10f00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
10f10 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65    }.  rc = close
10f20 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
10f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a  return rc;.}./**
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d   End of the dot-
10f60 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  file lock implem
10f70 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66  ******** Begin f
11050 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  lock Locking ***
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11080 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63  .** Use the floc
11090 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  k() system call 
110a0 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69  to do file locki
110b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  ng..**.** flock(
110c0 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  ) locking is lik
110d0 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69  e dot-file locki
110e0 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76  ng in that the v
110f0 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67  arious.** fine-g
11100 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  rain locking lev
11110 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  els supported by
11120 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c   SQLite are coll
11130 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20  apsed into.** a 
11140 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65  single exclusive
11150 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72   lock.  In other
11160 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20   words, SHARED, 
11170 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a  RESERVED, and.**
11180 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61   PENDING locks a
11190 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  re the same thin
111a0 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56  g as an EXCLUSIV
111b0 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a  E lock.  SQLite.
111c0 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77  ** still works w
111d0 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c  hen you do this,
111e0 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79   but concurrency
111f0 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63   is reduced sinc
11200 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e.** only a sing
11210 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62  le process can b
11220 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  e reading the da
11230 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65  tabase at a time
11240 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69  ..**.** Omit thi
11250 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c  s section if SQL
11260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11270 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e  NG_STYLE is turn
11280 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a 20  ed off or if.** 
11290 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56 58  compiling for VX
112a0 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53 51  WORKS..*/.#if SQ
112b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
112c0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
112d0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
112e0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
112f0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
11300 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
11310 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
11320 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
11330 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
11340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
11350 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
11360 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
11370 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
11380 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
11390 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
113a0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
113b0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
113c0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
113d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
113e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
113f0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
11400 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
11410 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
11420 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
11430 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
11440 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
11450 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
11460 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
11470 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
11480 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
11490 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
114a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
114b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
114c0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
114d0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
114e0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
114f0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
11500 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
11510 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
11520 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11530 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
11540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11550 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11560 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11570 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11580 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
11590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
115a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
115b0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
115c0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
115d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
115e0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
115f0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
11600 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
11610 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
11620 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11630 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
11640 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
11650 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
11660 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
11670 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
11680 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
11690 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
116a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
116b0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
116c0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
116d0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
116e0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
116f0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
11700 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
11710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
11720 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
11730 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
11740 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
11750 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
11760 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
11770 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
11780 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
11790 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
117a0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
117b0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
117c0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
117d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
117e0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53   .        if( IS
117f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
11800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11810 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11820 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
11830 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
11840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11850 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
11870 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
11880 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
11890 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
118a0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
118b0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
118c0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
118d0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
118e0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
118f0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
11900 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11910 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
11920 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11930 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11940 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
11950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11960 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11970 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11980 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
11990 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
119a0 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
119b0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
119c0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
119d0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
119e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
119f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
11a00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11a10 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
11a20 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
11a30 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
11a40 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
11a50 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
11a60 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11a80 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11a90 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11aa0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11ab0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11ac0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11ad0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
11ae0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
11af0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
11b00 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
11b10 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
11b20 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11b30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11b40 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11b50 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11b60 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11b70 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11b80 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11b90 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11ba0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11bb0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11bc0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
11be0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
11bf0 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
11c00 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
11c10 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
11c20 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11c30 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11c40 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11c50 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
11c60 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
11c70 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
11c80 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
11c90 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
11ca0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
11cb0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
11cc0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
11cd0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11ce0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11cf0 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
11d00 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11d10 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
11d20 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
11d30 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
11d40 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
11d50 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
11d60 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
11d70 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
11d80 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
11d90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
11da0 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
11db0 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
11dc0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
11dd0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
11de0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
11df0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
11e00 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
11e10 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
11e20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e30 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11e40 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11e50 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11e60 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11e70 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11e80 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
11e90 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
11ea0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11eb0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11ec0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
11ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11ee0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11ef0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11f00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11f10 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
11f20 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
11f30 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
11f40 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
11f50 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
11f60 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
11f70 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
11f80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11f90 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
11fa0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11fb0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11fd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11fe0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
11ff0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
12000 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
12010 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12020 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
12030 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
12040 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
12050 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
12060 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
12070 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12080 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12090 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
120a0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
120b0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
120c0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46  (rc) ){.      pF
120d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
120e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20   tErrno;.    }. 
120f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
12100 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
12110 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
12120 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
12130 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12140 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
12150 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
12160 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
12170 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12180 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
12190 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
121a0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
121b0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
121c0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
121d0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
121e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
121f0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
12200 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
12210 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
12220 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
12230 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
12240 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12250 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
12260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12270 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
12280 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12290 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
122a0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
122b0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
122c0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
122d0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
122e0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
122f0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12300 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12310 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12320 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12330 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12340 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
12350 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
12360 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12370 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12380 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
12390 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
123a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
123b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
123c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
123d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
123e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
123f0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
12400 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
12410 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12420 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12430 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12440 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64  FileLock, getpid
12450 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ()));.  assert( 
12460 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12470 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12480 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12490 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
124a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
124b0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
124c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
124d0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
124e0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
124f0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
12500 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
12510 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
12520 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
12530 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
12540 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12550 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12570 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12580 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
12590 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
125a0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
125b0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
125c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
125d0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
125e0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
125f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
12600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
12610 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
12620 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
12630 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12640 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
12650 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
12660 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12670 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
12680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
12690 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
126a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
126b0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
126c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
126d0 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
126e0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
126f0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
12700 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
12710 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
12720 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12730 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12740 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12750 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
12760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12770 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
12780 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127f0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
12800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12860 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
12870 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
12880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12890 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
128a0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
128b0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
128c0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
128d0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
128e0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
128f0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
12900 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
12910 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
12920 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
12930 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
12940 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
12950 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
12960 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
12970 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
12980 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
12990 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
129a0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
129b0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
129c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
129d0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
129e0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
129f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a00 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
12a10 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
12a20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
12a30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12a40 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12a50 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12a60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12a70 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12a80 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12a90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12aa0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12ab0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12ac0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12ad0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
12ae0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
12af0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
12b00 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
12b10 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
12b20 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b  tic int semCheck
12b30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
12b40 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12b50 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
12b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12b80 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12b90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12ba0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
12bb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12bd0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
12be0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
12bf0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
12c00 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12c10 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12c20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12c30 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12c40 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12c50 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12c60 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12c70 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12c80 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12c90 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12ca0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12cb0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12cc0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
12cd0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
12ce0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20  node->pSem;.    
12cf0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
12d00 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Buf;..    if( se
12d10 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
12d20 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
12d30 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12d40 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
12d50 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
12d60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12d70 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
12d80 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
12d90 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12da0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
12db0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
12dc0 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
12dd0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
12df0 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
12e00 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
12e10 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
12e20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
12e30 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
12e40 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
12e50 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
12e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12e70 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
12e80 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
12e90 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
12ea0 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
12eb0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
12ec0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
12ed0 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
12ee0 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
12ef0 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
12f00 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
12f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f20 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12f30 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12f40 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12f50 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12f60 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12f70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12f80 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12f90 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12fa0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12fb0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12fc0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12fd0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12fe0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ff0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13000 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13010 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13020 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13030 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13040 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13050 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13060 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
13070 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
13080 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
13090 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
130a0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
130b0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
130c0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
130d0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
130e0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
130f0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13100 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13110 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13120 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13130 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13140 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13150 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13160 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13170 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13180 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13190 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
131a0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
131b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
131c0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
131d0 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
131e0 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
131f0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
13200 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
13210 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
13220 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
13230 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
13240 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
13250 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
13260 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
13270 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
13280 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
13290 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
132a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
132b0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
132c0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
132d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
132e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
132f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
13300 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
13310 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
13320 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
13330 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
13340 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c   int semLock(sql
13350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13360 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13370 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
13380 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
13390 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73  d;.  int fd;.  s
133a0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
133b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
133c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
133d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66  ITE_OK;..  /* if
133e0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
133f0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
13400 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
13410 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
13420 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
13430 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
13440 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
13450 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
13460 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13470 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
13480 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ck;.    rc = SQL
13490 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
134a0 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
134b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20   }.  .  /* lock 
134c0 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75  semaphore now bu
134d0 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20  t bail out when 
134e0 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20  already locked. 
134f0 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79  */.  if( sem_try
13500 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
13510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13520 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
13530 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   sem_end_lock;. 
13540 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c   }..  /* got it,
13550 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13560 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13570 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13580 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a  k = eFileLock;..
13590 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20   sem_end_lock:. 
135a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
135b0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
135c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
135d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
135e0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
135f0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
13600 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
13610 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
13620 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
13630 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
13640 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
13650 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
13660 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
13670 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
13680 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
13690 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
136a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
136b0 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f  atic int semUnlo
136c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
136d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
136e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
136f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13700 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
13710 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
13720 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
13730 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
13750 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
13760 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
13770 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
13780 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13790 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20 20 70  eFileLock,..   p
137a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
137b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
137c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
137d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
137e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
137f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
13800 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13810 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
13820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13840 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
13850 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
13860 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
13870 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
13880 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
13890 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
138a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
138b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
138c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
138d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
138e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
138f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
13900 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
13910 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
13920 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
13930 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
13940 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13950 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13960 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
13970 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
13980 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
13990 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
139a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
139b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
139c0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
139d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
139e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
139f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a00 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
13a10 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
13a20 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
13a30 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13a40 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
13a50 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
13a60 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13a70 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
13a80 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13aa0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
13ab0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13ac0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
13ad0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
13ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
13af0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
13b00 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
13b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
13b30 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
13b40 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
13b50 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
13b60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
13b70 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13b90 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
13ba0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
13bb0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
13c90 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13cc0 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
13cd0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
13ce0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
13cf0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
13d00 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
13d10 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
13d20 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
13d30 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
13d40 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
13d50 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
13d60 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
13d70 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
13d80 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
13d90 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
13da0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
13db0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
13dc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
13dd0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
13de0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
13df0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
13e00 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
13e10 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
13e20 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
13e30 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
13e40 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
13e50 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
13e60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
13e70 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
13e80 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
13e90 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
13ea0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13eb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
13ec0 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
13ed0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
13ee0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13ef0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
13f00 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
13f10 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
13f20 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
13f30 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
13f40 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
13f50 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
13f60 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
13f70 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
13f80 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
13f90 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
13fa0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
13fb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
13fc0 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
13fe0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
13ff0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14000 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14010 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14020 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14030 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14040 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14070 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14080 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
14090 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
140a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
140b0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
140c0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
140d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
140e0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
140f0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
14100 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
14110 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
14120 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
14130 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
14140 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
14150 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14160 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
14170 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
14180 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
14190 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
141a0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
141b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
141c0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
141d0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
141e0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
141f0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
14200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
14210 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
14220 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14230 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14240 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14250 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14260 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14270 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14280 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14290 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
142a0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
142b0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
142c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
142d0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
142e0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
142f0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
14300 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14310 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
14320 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14330 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14340 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14350 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14360 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14370 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14380 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14390 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
143a0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
143b0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
143c0 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
143d0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
143e0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
143f0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
14400 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
14410 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
14420 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14430 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14440 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14450 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14460 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14470 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14480 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14490 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
144a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
144b0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
144c0 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
144d0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
144e0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
144f0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
14500 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
14510 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
14520 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14530 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14540 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14550 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14560 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14570 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14590 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
145a0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
145b0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
145c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
145d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
145e0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
145f0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
14600 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
14610 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
14620 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14630 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14640 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14650 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14680 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14690 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
146a0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
146b0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
146c0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
146d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
146e0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
146f0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
14700 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
14710 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
14720 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
14730 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
14740 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
14750 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
14760 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
14770 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
14780 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
14790 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
147a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
147b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
147c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
147d0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
147e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
147f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
14800 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14810 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14820 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14830 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
14840 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
14850 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14860 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14870 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14880 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14890 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
148a0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
148b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
148c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
148d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
148e0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
148f0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
14900 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
14910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14920 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
14930 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
14940 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
14950 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
14960 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
14970 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
14980 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14990 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
149a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
149b0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
149c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
149d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
149e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
149f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
14a00 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
14a10 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
14a20 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
14a30 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
14a40 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
14a50 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
14a60 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
14a70 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
14a80 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
14a90 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14aa0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
14ab0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
14ac0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
14ad0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
14ae0 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
14af0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
14b00 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
14b10 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
14b20 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
14b30 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
14b40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
14b50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
14b60 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
14b70 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
14b80 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
14b90 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
14ba0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
14bb0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
14bc0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
14bd0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
14be0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
14bf0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
14c00 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
14c10 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
14c20 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
14c30 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14c40 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
14c50 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
14c60 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
14c70 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
14c80 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14ca0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14cb0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
14cc0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
14cd0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
14ce0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
14cf0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
14d00 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14d10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14d20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14d30 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
14d40 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
14d50 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
14d60 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
14d70 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
14d80 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14d90 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14da0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14db0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14dc0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14dd0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14de0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14df0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14e00 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14e10 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14e20 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14e30 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
14e40 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
14e50 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
14e60 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
14e70 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
14e80 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14e90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14ea0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14eb0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14ec0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14ed0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14ee0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14ef0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14f00 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14f10 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14f20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14f30 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
14f40 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
14f50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14f60 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14f70 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14f80 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14f90 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14fa0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14fb0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
14fd0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14fe0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
14ff0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
15000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15010 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15020 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15030 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
15040 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15050 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
15060 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15070 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15080 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15090 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
150a0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
150b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
150c0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
150d0 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
150e0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
150f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15100 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15110 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
15120 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
15130 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
15140 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15150 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
15160 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
15170 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
15180 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
15190 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
151a0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
151b0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
151c0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
151d0 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
151e0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
151f0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
15200 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
15210 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
15220 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15230 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15250 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
15260 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
15270 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15280 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
15290 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
152a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
152b0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
152c0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
152d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
152f0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
15300 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
15310 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
15320 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
15330 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
15340 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
15350 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
15360 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
15370 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
15380 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
15390 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
153a0 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
153b0 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
153c0 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
153d0 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
153e0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
153f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15400 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
15410 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
15420 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15430 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15440 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
15450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15460 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
15470 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
15480 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
15490 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
154a0 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
154b0 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
154c0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
154d0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
154e0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
154f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
15500 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
15510 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
15520 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
15530 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
15540 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
15550 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
15560 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
15570 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
15580 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15590 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
155a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
155b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
155c0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
155d0 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
155e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
155f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
15600 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
15610 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
15620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15630 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
15640 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15650 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
15660 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
15670 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
15680 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
15690 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
156a0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
156b0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
156c0 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
156d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
156e0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
156f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
15700 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15710 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
15720 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
15730 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
15740 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
15750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
15760 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
15770 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
15780 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15790 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
157a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
157b0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
157c0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
157d0 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
157e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
157f0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
15800 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
15810 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
15820 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
15830 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
15840 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
15850 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
15860 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
15870 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
15880 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
15890 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
158a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
158b0 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
158c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
158d0 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
158e0 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
158f0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
15900 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
15910 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
15920 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15930 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
15940 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
15950 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
15960 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
15970 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
15980 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15990 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
159a0 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
159b0 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
159c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159d0 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
159e0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
159f0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
15a00 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
15a10 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
15a20 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
15a30 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
15a40 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
15a50 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
15a60 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
15a70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15a80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15a90 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
15aa0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
15ab0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
15ac0 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
15ad0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
15ae0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
15af0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15b00 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
15b10 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
15b20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
15b30 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
15b40 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
15b50 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
15b60 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
15b70 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
15b80 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
15b90 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
15ba0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
15bb0 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
15bc0 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
15bd0 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
15be0 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
15bf0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
15c00 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
15c10 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
15c20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
15c30 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15c40 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
15c50 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
15c60 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
15c70 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
15c80 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15c90 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
15ca0 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
15cb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15cc0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
15cd0 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
15ce0 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
15cf0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
15d00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15d10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15d20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
15d30 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
15d40 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15d50 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
15d60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15d70 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
15d80 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
15d90 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15da0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15db0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
15dc0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
15dd0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
15de0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
15df0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
15e00 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
15e20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
15e30 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
15e40 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15e50 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
15e60 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
15e70 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
15e80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
15e90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
15ea0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
15eb0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15ec0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
15ed0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
15ee0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
15ef0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
15f00 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
15f10 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
15f20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
15f30 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
15f40 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
15f50 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
15f60 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
15f70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
15f80 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
15f90 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
15fa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
15fb0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
15fc0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
15fd0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
15fe0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
15ff0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
16000 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
16010 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
16020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
16030 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16040 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
16050 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
16060 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
16070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
16080 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
16090 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
160a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
160b0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
160c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
160d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
160e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
160f0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
16100 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
16110 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
16120 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
16130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16140 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
16150 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
16160 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
16170 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
16180 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
16190 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
161a0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
161b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
161c0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
161d0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
161e0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
161f0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
16200 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16210 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
16220 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
16230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16240 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
16250 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16260 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
16270 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
162a0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
162b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
162c0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
162d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
162e0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
162f0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
16300 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
16310 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
16320 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16330 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16340 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16350 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16380 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16390 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
163a0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
163b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
163c0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
163f0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16400 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
16410 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
16420 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16430 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
16440 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
16450 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
16460 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
16470 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
16480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16490 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
164a0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
164b0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
164c0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
164e0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
164f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
16500 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16510 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
16520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16530 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
16540 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16550 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
16560 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
16570 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
16580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16590 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
165a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
165b0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
165c0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
165d0 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
165e0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
165f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16600 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16610 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
16620 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
16630 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
16640 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
16650 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
16660 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16670 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
16680 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
16690 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
166a0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
166b0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
166c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
166d0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
166e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
166f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16700 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
16710 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
16720 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
16730 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
16740 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
16750 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
16760 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
16770 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
16780 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
16790 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
167a0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
167b0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
167c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
167d0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
167e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
167f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
16800 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
16810 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16820 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
16830 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16840 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
16850 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16860 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
16870 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
16880 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
16890 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
168a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
168b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
168c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
168d0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
168e0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
168f0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
16900 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
16910 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
16920 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
16930 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
16940 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
16950 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
16960 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
16970 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
16980 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
16990 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
169a0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
169b0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
169c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
169d0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
169e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
169f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16a00 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16a10 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
16a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16a40 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a50 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
16a60 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
16a70 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
16a80 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
16a90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16aa0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
16ac0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16ad0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16ae0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
16af0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
16b00 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
16b10 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
16b20 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
16b30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
16b40 20 20 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42     .#ifndef NDEB
16b50 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
16b60 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
16b70 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
16b80 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
16b90 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
16ba0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
16bb0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
16bc0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
16bd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
16be0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
16bf0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
16c00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16c10 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
16c20 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
16c30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
16c40 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
16c50 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
16c60 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
16c70 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
16c80 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
16c90 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
16ca0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
16cb0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
16cc0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
16cd0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
16ce0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
16cf0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
16d00 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
16d10 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
16d20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
16d30 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
16d40 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
16d50 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
16d60 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
16d70 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
16d80 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
16d90 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
16da0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
16db0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
16dc0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
16dd0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
16de0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
16df0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16e00 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16e10 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
16e20 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
16e30 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
16e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16e50 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
16e60 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
16e80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
16e90 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
16ea0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16eb0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
16ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
16ed0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
16ee0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
16ef0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
16f00 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
16f10 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16f20 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
16f30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
16f40 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
16f50 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
16f60 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
16f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16f80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16f90 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
16fa0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
16fb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
16fc0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16fd0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16fe0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
17000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17010 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
17020 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
17030 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
17040 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17050 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
17060 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17070 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17080 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17090 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
170a0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
170b0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
170c0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
170d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
170e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
170f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17100 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17110 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
17120 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17130 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17140 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
17150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17160 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
17170 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
17180 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17190 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
171a0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
171b0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
171c0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
171d0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
171e0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
171f0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
17200 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
17210 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
17220 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
17230 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
17240 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
17250 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
17260 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
17270 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
17280 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
17290 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
172a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172b0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
172c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172d0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
172e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
172f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
17300 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
17310 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
17320 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
17330 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17340 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
17350 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
17360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17370 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
17380 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17390 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
173a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
173b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
173c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
173d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
173e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
173f0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
17400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
17410 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
17420 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
17430 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
17440 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
17450 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
17460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17470 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
17480 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
17490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
174a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
174b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
174c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174d0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
174e0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
174f0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
17500 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
17510 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
17520 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
17530 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
17550 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
17560 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17570 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
17580 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
17590 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
175a0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
175b0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
175c0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
175d0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
175e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
175f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
17600 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
17610 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
17620 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
17630 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
17640 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
17650 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
17660 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
17670 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
17680 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
17690 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
176a0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
176b0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
176c0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
176d0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
176e0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
176f0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
17700 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
17710 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
17720 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
17730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
17740 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17750 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
17760 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
17770 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
17780 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
17790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
177a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
177b0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
177c0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
177d0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
177e0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
177f0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
17800 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
17810 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
17820 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
17830 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
17840 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
17850 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
17860 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
17870 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
17880 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
17890 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
178a0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
178b0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
178c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
178d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
178f0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
17900 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17970 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
179c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
179d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
179e0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
179f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
17a10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
17a20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
17a30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
17a40 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
17a50 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17a60 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17a70 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17a80 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
17a90 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
17aa0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
17ab0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
17ac0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
17ad0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17ae0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
17af0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
17b00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
17b10 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17b20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17b30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17b40 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
17b50 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
17b60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17b70 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
17b80 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
17b90 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
17ba0 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
17bb0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
17bc0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
17bd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
17be0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
17bf0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
17c00 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
17c10 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
17c20 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
17c30 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
17c40 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
17c50 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
17c60 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
17c70 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
17c80 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
17c90 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
17cb0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
17cc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ce0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
17cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d30 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
17d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17d80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
17d90 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
17da0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
17db0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
17dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17dd0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
17de0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
17df0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
17e00 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
17e10 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
17e20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
17e30 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
17e40 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
17e50 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
17e60 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
17e70 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
17e80 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
17e90 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
17ea0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
17eb0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
17ec0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
17ed0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
17ee0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
17ef0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
17f00 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
17f10 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
17f20 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
17f30 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
17f40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
17f50 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
17f60 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
17f70 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
17f80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
17f90 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
17fa0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
17fb0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
17fc0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
17fd0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
17fe0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
17ff0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
18000 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
18010 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
18020 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
18030 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
18040 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
18050 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
18060 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
18070 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
18080 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
18090 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
180a0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
180b0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
180c0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
180d0 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
180e0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
180f0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18100 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
18110 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
18120 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
18130 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
18140 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
18150 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
18160 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
18170 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
18180 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18190 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20  .  int got;.#if 
181a0 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
181b0 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
181c0 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
181d0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
181e0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
181f0 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
18200 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
18210 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64  o{ got = osPread
18220 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
18230 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69  t, offset); }whi
18240 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18250 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 53  no==EINTR );.  S
18260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18270 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
18280 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18290 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
182a0 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
182b0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
182c0 66 66 73 65 74 29 3b 20 7d 77 68 69 6c 65 28 20  ffset); }while( 
182d0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
182e0 45 49 4e 54 52 29 3b 0a 20 20 53 69 6d 75 6c 61  EINTR);.  Simula
182f0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
18300 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e   -1 );.#else.  n
18310 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
18320 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
18330 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 53 69 6d  SEEK_SET);.  Sim
18340 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
18350 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 69  wOffset-- );.  i
18360 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
18370 66 73 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20  fset ){.    if( 
18380 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
18390 29 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  ){.      ((unixF
183a0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
183b0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
183c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 28 28   }else{.      ((
183d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
183e0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 09 09 09  astErrno = 0;...
183f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18400 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 64 6f 7b 20  n -1;.  }.  do{ 
18410 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
18420 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 20  >h, pBuf, cnt); 
18430 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
18440 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
18450 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18460 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18470 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18480 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18490 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
184a0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
184b0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
184c0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
184d0 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
184e0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
184f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18500 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
18510 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
18520 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
18530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
18540 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
18550 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
18560 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
18570 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
18580 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
18590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
185a0 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
185b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
185c0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
185d0 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
185e0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
185f0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
18600 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18610 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
18620 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
18630 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
18640 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
18650 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
18660 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
18670 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
18680 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
18690 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
186a0 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
186b0 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
186c0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
186d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
186e0 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
186f0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
18700 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
18710 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
18720 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
18730 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   .  );.#endif.. 
18740 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
18750 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
18760 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
18770 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
18780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18790 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
187a0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
187b0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
187c0 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
187d0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
187e0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
187f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
18800 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
18810 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
18820 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
18830 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
18840 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
18850 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
18860 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
18870 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
18880 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
18890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
188a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
188b0 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
188c0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
188d0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
188e0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
188f0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
18900 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
18910 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18920 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
18930 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
18940 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
18950 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
18960 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18970 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
18980 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
18990 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
189a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
189b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
189c0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
189d0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
189e0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
189f0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
18a00 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
18a10 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
18a20 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
18a30 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
18a40 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
18a50 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41  ndif.  TIMER_STA
18a60 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
18a70 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
18a80 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28   got = osPwrite(
18a90 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
18aa0 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
18ab0 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
18ac0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
18ad0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
18ae0 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
18af0 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64   = osPwrite64(id
18b00 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
18b10 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20  offset);}while( 
18b20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
18b30 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
18b40 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  do{.    newOffse
18b50 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
18b60 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
18b70 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
18b80 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
18b90 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
18ba0 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
18bb0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
18bc0 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
18bd0 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
18be0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18bf0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
18c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c10 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
18c20 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
18c30 30 3b 09 09 09 0a 20 20 20 20 20 20 7d 0a 20 20  0;....      }.  
18c40 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
18c50 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
18c60 73 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  sWrite(id->h, pB
18c70 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69  uf, cnt);.  }whi
18c80 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
18c90 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
18ca0 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  dif.  TIMER_END;
18cb0 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
18cc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18cd0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18ce0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f   errno;.  }..  O
18cf0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
18d00 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
18d10 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  %llu\n", id->h, 
18d20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d  got, offset, TIM
18d30 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
18d40 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a  return got;.}...
18d50 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
18d60 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
18d70 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
18d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18d90 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
18da0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18db0 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
18dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
18dd0 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
18de0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
18df0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
18e00 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
18e10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
18e20 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
18e30 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18e40 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
18e50 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
18e60 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
18e70 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
18e80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
18e90 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
18ea0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
18eb0 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
18ec0 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
18ed0 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
18ee0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
18ef0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
18f00 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
18f10 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
18f20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
18f30 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
18f40 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
18f50 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
18f60 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
18f70 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
18f80 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
18f90 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
18fa0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
18fb0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
18fc0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
18fd0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
18fe0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
18ff0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
19000 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
19010 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
19020 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
19030 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
19040 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
19050 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
19060 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
19070 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
19080 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
19090 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
190a0 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
190b0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
190c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
190d0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
190e0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
190f0 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
19100 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
19110 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
19120 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
19130 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
19140 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
19150 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
19160 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
19170 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
19180 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
19190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
191a0 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
191b0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
191c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
191d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
191e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
191f0 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
19200 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
19210 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
19220 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
19230 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
19240 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
19250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19260 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
19270 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
19280 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19290 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
192a0 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
192b0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
192c0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
192d0 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
192e0 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
192f0 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
19300 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
19310 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
19320 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
19330 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
19340 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
19350 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
19360 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
19370 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
19380 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66   amt>0 ){.    if
19390 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
193a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
193b0 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
193c0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
193d0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
193e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
193f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
19400 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
19410 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
19420 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19430 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19440 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
19450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
19460 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
19470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19490 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
194a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
194b0 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
194c0 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
194d0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
194e0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
194f0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
19500 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
19510 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
19520 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
19530 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
19540 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
19550 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
19560 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
19570 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
19580 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
19590 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
195a0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
195b0 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
195c0 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
195d0 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
195e0 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
195f0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
19600 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
19610 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
19620 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
19630 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
19640 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
19650 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
19660 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
19670 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ync.*/.#if !defi
19680 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 0a 23  ned(fdatasync).#
19690 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
196a0 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
196b0 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
196c0 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
196d0 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
196e0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
196f0 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
19700 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
19710 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
19720 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
19730 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
19740 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
19750 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
19760 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
19770 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
19780 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
19790 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
197a0 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
197b0 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
197c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63  ./*.** The fsync
197d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64  () system call d
197e0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20  oes not work as 
197f0 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61  advertised on ma
19800 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65  ny.** unix syste
19810 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ms.  The followi
19820 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  ng procedure is 
19830 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  an attempt to ma
19840 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65  ke.** it work be
19850 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tter..**.** The 
19860 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d  SQLITE_NO_SYNC m
19870 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c  acro disables al
19880 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69  l fsync()s.  Thi
19890 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66  s is useful.** f
198a0 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20  or testing when 
198b0 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74  we want to run t
198c0 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20  hrough the test 
198d0 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a  suite quickly..*
198e0 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67  * You are strong
198f0 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a  ly advised *not*
19900 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20   to deploy with 
19910 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a  SQLITE_NO_SYNC.*
19920 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76  * enabled, howev
19930 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53  er, since with S
19940 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e  QLITE_NO_SYNC en
19950 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61  abled, an OS cra
19960 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  sh.** or power f
19970 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65  ailure will like
19980 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
19990 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
199a0 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20  .** SQLite sets 
199b0 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
199c0 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  g if the size of
199d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63   the file is unc
199e0 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69  hanged..** The i
199f0 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f  dea behind dataO
19a00 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20 73  nly is that it s
19a10 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65  hould only write
19a20 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e   the file conten
19a30 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f  t.** to disk, no
19a40 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65  t the inode.  We
19a50 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e   only set dataOn
19a60 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ly if the file s
19a70 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61  ize is .** uncha
19a80 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 66  nged since the f
19a90 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72 74  ile size is part
19aa0 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20   of the inode.  
19ab0 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64  However, .** Ted
19ac0 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74   Ts'o tells us t
19ad0 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  hat fdatasync() 
19ae0 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20  will also write 
19af0 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65  the inode if the
19b00 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61  .** file size ha
19b10 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20  s changed.  The 
19b20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72  only real differ
19b30 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64 61  ence between fda
19b40 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20  tasync().** and 
19b50 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c  fsync(), Ted tel
19b60 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20 66  ls us, is that f
19b70 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
19b80 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a  not flush the.**
19b90 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74   inode if the mt
19ba0 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20  ime or owner or 
19bb0 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72  other inode attr
19bc0 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61 6e  ibutes have chan
19bd0 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20  ged..** We only 
19be0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 66  care about the f
19bf0 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68  ile size, not th
19c00 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74  e other file att
19c10 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61  ributes, so.** a
19c20 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65 20  s far as SQLite 
19c30 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e  is concerned, an
19c40 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73 20   fdatasync() is 
19c50 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65 2e  always adequate.
19c60 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79  .** So, we alway
19c70 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63 28  s use fdatasync(
19c80 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c  ) if it is avail
19c90 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73  able, regardless
19ca0 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   of.** the value
19cb0 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79   of the dataOnly
19cc0 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   flag..*/.static
19cd0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
19ce0 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
19cf0 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
19d00 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
19d10 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
19d20 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65  ng "ifdef/elif/e
19d30 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20  lse/" block has 
19d40 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74 75  the same structu
19d50 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f  re as.  ** the o
19d60 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20  ne below. It is 
19d70 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65 20  replicated here 
19d80 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20  solely to avoid 
19d90 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a  cluttering .  **
19da0 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64   up the real cod
19db0 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53 45  e with the UNUSE
19dc0 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61  D_PARAMETER() ma
19dd0 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  cros..  */.#ifde
19de0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
19df0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19e00 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
19e10 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
19e20 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
19e30 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
19e40 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  ly);.#elif HAVE_
19e50 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53  FULLFSYNC.  UNUS
19e60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
19e70 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20  aOnly);.#else.  
19e80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19e90 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e  (fullSync);.  UN
19ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
19eb0 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66  ataOnly);.#endif
19ec0 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
19ed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
19ee0 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e  s that we do a n
19ef0 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e  ormal fsync() an
19f00 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43  d .  ** FULLSYNC
19f10 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
19f20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74  during testing t
19f30 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
19f40 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  is procedure.  *
19f50 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69  * gets called wi
19f60 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  th the correct a
19f70 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23  rguments..  */.#
19f80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19f90 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  T.  if( fullSync
19fa0 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73   ) sqlite3_fulls
19fb0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73  ync_count++;.  s
19fc0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
19fd0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
19fe0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
19ff0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
1a000 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
1a010 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
1a020 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
1a030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1a040 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51  O_SYNC.  rc = SQ
1a050 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48  LITE_OK;.#elif H
1a060 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1a070 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
1a080 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1a090 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1a0a0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1a0b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1a0c0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1a0d0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1a0e0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1a0f0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1a100 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1a110 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1a120 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1a130 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1a140 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1a150 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1a160 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1a170 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1a180 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1a190 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1a1a0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1a1b0 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1a1c0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1a1d0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1a1e0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1a1f0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1a200 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1a210 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1a220 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1a230 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1a240 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1a250 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1a260 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1a270 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1a280 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1a290 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1a2a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1a2b0 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1a2c0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1a2d0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1a2e0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1a2f0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1a300 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1a310 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1a320 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1a330 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1a340 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1a350 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1a360 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1a370 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1a380 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1a390 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1a3a0 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1a3b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1a3c0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1a3d0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1a3e0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1a3f0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1a400 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1a410 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1a420 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1a430 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1a440 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1a450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a460 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1a470 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1a480 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1a490 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1a4a0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1a4b0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1a4c0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1a4d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1a4e0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1a4f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1a500 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1a510 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1a520 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1a530 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1a540 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1a550 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1a560 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1a570 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1a580 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1a590 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1a5a0 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1a5b0 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1a5c0 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1a5d0 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1a5e0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1a5f0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1a600 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1a610 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1a620 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1a630 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1a640 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1a650 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1a660 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1a670 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1a680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1a690 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1a6a0 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1a6b0 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1a6c0 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1a6d0 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1a6e0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1a6f0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1a700 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1a710 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1a720 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1a730 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1a740 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1a750 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1a760 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1a770 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1a780 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1a790 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1a7a0 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1a7b0 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1a7c0 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1a7d0 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1a7e0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1a7f0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1a800 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1a810 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1a820 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1a830 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1a840 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a850 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1a860 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1a870 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1a880 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1a890 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1a8a0 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1a8b0 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1a8c0 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1a8d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1a8e0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1a8f0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1a900 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1a910 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1a920 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1a930 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1a940 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1a950 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1a960 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1a970 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1a980 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1a990 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1a9a0 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1a9b0 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1a9c0 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1a9d0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
1a9e0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1a9f0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1aa00 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69   if( fd>=0 ){.#i
1aa10 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a  fdef FD_CLOEXEC.
1aa20 20 20 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64        osFcntl(fd
1aa30 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
1aa40 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
1aa50 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
1aa60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1aa70 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1aa80 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1aa90 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20   zDirname));.   
1aaa0 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20   }.  }.  *pFd = 
1aab0 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64  fd;.  return (fd
1aac0 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e  >=0?SQLITE_OK:un
1aad0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1aae0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
1aaf0 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d   "open", zDirnam
1ab00 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  e));.}../*.** Ma
1ab10 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
1ab20 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
1ab30 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
1ab40 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
1ab50 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
1ab60 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
1ab70 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
1ab80 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
1ab90 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
1aba0 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
1abb0 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
1abc0 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
1abd0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
1abe0 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
1abf0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
1ac00 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
1ac10 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
1ac20 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1ac30 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
1ac40 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
1ac50 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
1ac60 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
1ac70 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
1ac80 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
1ac90 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
1aca0 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
1acb0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
1acc0 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
1acd0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ace0 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1acf0 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
1ad00 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
1ad10 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
1ad20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
1ad30 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
1ad40 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
1ad50 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
1ad60 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1ad70 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
1ad80 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
1ad90 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
1ada0 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
1adb0 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
1adc0 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
1add0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1ade0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
1adf0 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71   int unixSync(sq
1ae00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1ae10 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
1ae20 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
1ae30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1ae40 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20  ile*)id;..  int 
1ae50 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c  isDataOnly = (fl
1ae60 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ags&SQLITE_SYNC_
1ae70 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  DATAONLY);.  int
1ae80 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66   isFullsync = (f
1ae90 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1aea0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20  TE_SYNC_FULL;.. 
1aeb0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
1aec0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
1aed0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
1aee0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
1aef0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
1af00 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1af10 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
1af20 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
1af30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1af40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
1af50 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
1af60 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
1af70 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1af80 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
1af90 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
1afa0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
1afb0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
1afc0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1afd0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1afe0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
1aff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1b000 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  L );..  assert( 
1b010 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1b020 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE(("SYNC    %-3
1b030 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
1b040 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73  ;.  rc = full_fs
1b050 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73  ync(pFile->h, is
1b060 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61  Fullsync, isData
1b070 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Only);.  Simulat
1b080 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1b090 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1b0a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1b0b0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1b0c0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1b0d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b0e0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
1b0f0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
1b100 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
1b110 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
1b120 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1b130 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
1b140 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
1b150 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
1b160 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
1b170 20 6f 63 63 75 72 72 61 6e 63 65 2e 20 20 4d 61   occurrance.  Ma
1b180 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
1b190 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
1b1a0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
1b1b0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
1b1c0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
1b1d0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
1b1e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1b1f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1b200 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
1b210 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
1b220 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
1b230 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
1b240 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
1b250 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
1b260 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
1b270 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
1b280 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
1b290 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
1b2a0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1b2b0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
1b2c0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
1b2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
1b2e0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
1b2f0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
1b300 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
1b310 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
1b320 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e  le, dirfd, __LIN
1b330 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
1b340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
1b350 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
1b360 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b370 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1b380 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1b390 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1b3a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1b3b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1b3c0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1b3d0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1b3e0 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1b3f0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1b400 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1b410 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1b420 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b430 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1b440 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1b450 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1b460 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b470 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1b480 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1b490 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b4a0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1b4b0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1b4c0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1b4d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1b4e0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1b4f0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1b500 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1b510 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1b520 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1b530 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1b540 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1b550 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1b560 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1b570 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1b580 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1b590 68 75 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74  hunk ){.    nByt
1b5a0 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
1b5b0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
1b5c0 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
1b5d0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1b5e0 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
1b5f0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1b600 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f  (pFile->h, (off_
1b610 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
1b620 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
1b630 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1b640 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  no;.    return u
1b650 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1b660 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1b670 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1b680 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1b690 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
1b6a0 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  NDEBUG.    /* If
1b6b0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1b6c0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1b6d0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1b6e0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1b6f0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1b700 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1b710 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1b720 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1b730 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1b740 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1b750 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1b760 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1b770 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1b780 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1b790 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1b7a0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1b7b0 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1b7c0 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1b7d0 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1b7e0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1b7f0 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1b800 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1b810 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1b820 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1b830 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1b840 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1b850 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1b860 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1b870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1b880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b890 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1b8a0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1b8b0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1b8c0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1b8d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1b8e0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1b8f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1b900 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1b910 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1b920 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1b930 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1b940 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1b950 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1b960 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b970 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1b980 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28   rc!=0 ){.    ((
1b990 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
1b9a0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1b9b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b9c0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1b9d0 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1b9e0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1b9f0 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1ba00 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1ba10 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e  base, the findIn
1ba20 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  odeInfo() proced
1ba30 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
1ba40 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1ba50 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
1ba60 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
1ba70 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
1ba80 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
1ba90 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
1baa0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1bab0 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
1bac0 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
1bad0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
1bae0 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
1baf0 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
1bb00 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
1bb10 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
1bb20 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
1bb30 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
1bb40 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
1bb50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bb60 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1bb70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1bb80 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1bb90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1bba0 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
1bbb0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
1bbc0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
1bbd0 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
1bbe0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
1bbf0 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
1bc00 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1bc10 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
1bc20 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1bc30 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
1bc40 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  endif../* .** Th
1bc50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1bc60 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
1bc70 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
1bc80 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66  _SIZE_HINT .** f
1bc90 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72  ile-control oper
1bca0 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20  ation.  Enlarge 
1bcb0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1bcc0 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a  nBytes in size.*
1bcd0 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  * (rounded up to
1bce0 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d   the next chunk-
1bcf0 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64  size).  If the d
1bd00 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1bd10 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20  dy.** nBytes or 
1bd20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75  larger, this rou
1bd30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1bd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bd50 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1bd60 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1bd70 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1bd80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1bd90 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1bda0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bdb0 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1bdc0 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1bdd0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1bde0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1bdf0 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1be00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1be10 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1be20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1be30 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1be40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1be50 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20  _IOERR_FSTAT;.. 
1be60 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79     nSize = ((nBy
1be70 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  te+pFile->szChun
1be80 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a  k-1) / pFile->sz
1be90 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
1bea0 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28  szChunk;.    if(
1beb0 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e   nSize>(i64)buf.
1bec0 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20  st_size ){..#if 
1bed0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53  defined(HAVE_POS
1bee0 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26  IX_FALLOCATE) &&
1bef0 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c   HAVE_POSIX_FALL
1bf00 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54  OCATE.      /* T
1bf10 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73  he code below is
1bf20 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65   handling the re
1bf30 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73  turn value of os
1bf40 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20  Fallocate() .   
1bf50 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e     ** correctly.
1bf60 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1bf70 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
1bf80 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f   "returns zero o
1bf90 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20  n success, .    
1bfa0 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72    ** or an error
1bfb0 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c   number on  fail
1bfc0 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61  ure". See the ma
1bfd0 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c  npage for detail
1bfe0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  s. */.      int 
1bff0 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  err;.      do{. 
1c000 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46         err = osF
1c010 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e  allocate(pFile->
1c020 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20  h, buf.st_size, 
1c030 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a  nSize-buf.st_siz
1c040 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  e);.      }while
1c050 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a  ( err==EINTR );.
1c060 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20        if( err ) 
1c070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c080 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65  ERR_WRITE;.#else
1c090 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1c0a0 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   OS does not hav
1c0b0 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  e posix_fallocat
1c0c0 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69  e(), fake it. Fi
1c0d0 72 73 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  rst use.      **
1c0e0 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1c0f0 73 65 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a  set the file siz
1c100 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
1c110 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20  single byte to. 
1c120 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
1c130 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1c140 6f 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65  ock within the e
1c150 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20  xtended region. 
1c160 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
1c170 20 74 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69   the same techni
1c180 71 75 65 20 75 73 65 64 20 62 79 20 67 6c 69 62  que used by glib
1c190 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70  c to implement p
1c1a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1c1b0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73  .      ** on sys
1c1c0 74 65 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  tems that do not
1c1d0 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c   have a real fal
1c1e0 6c 6f 63 61 74 65 28 29 20 73 79 73 74 65 6d 20  locate() system 
1c1f0 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
1c200 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
1c210 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
1c220 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
1c230 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
1c240 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c260 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
1c270 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
1c280 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1c290 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1c2a0 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20  >h, nSize) ){.  
1c2b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1c2c0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1c2d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1c2e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c2f0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1c300 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1c310 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1c320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72       }.      iWr
1c330 69 74 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73  ite = ((buf.st_s
1c340 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31  ize + 2*nBlk - 1
1c350 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a  )/nBlk)*nBlk-1;.
1c360 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 57 72        while( iWr
1c370 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20  ite<nSize ){.   
1c380 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
1c390 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
1c3a0 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
1c3b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1c3c0 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
1c3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1c3e0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  R_WRITE;.       
1c3f0 20 69 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b   iWrite += nBlk;
1c400 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1c410 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1c440 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1c450 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1c460 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1c470 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1c480 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1c490 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1c4a0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1c4b0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1c4c0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1c4d0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c4e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c4f0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1c500 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1c510 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1c520 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1c530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c540 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c550 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e  SQLITE_LAST_ERRN
1c560 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1c570 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1c580 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1c590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c5a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1c5b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1c5c0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
1c5d0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
1c5e0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
1c5f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1c600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c610 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c620 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
1c630 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
1c640 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1c650 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1c660 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
1c670 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
1c680 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
1c690 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c6a0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c6b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c6c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c6d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
1c6e0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
1c6f0 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 20 3d    int bPersist =
1c700 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20   *(int*)pArg;.  
1c710 20 20 20 20 69 66 28 20 62 50 65 72 73 69 73 74      if( bPersist
1c720 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  <0 ){.        *(
1c730 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 70 46 69  int*)pArg = (pFi
1c740 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1c750 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
1c760 5f 57 41 4c 29 21 3d 30 3b 0a 20 20 20 20 20 20  _WAL)!=0;.      
1c770 7d 65 6c 73 65 20 69 66 28 20 62 50 65 72 73 69  }else if( bPersi
1c780 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1c790 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c7a0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 50  s &= ~UNIXFILE_P
1c7b0 45 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20  ERSIST_WAL;.    
1c7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c7d0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c7e0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 45  s |= UNIXFILE_PE
1c7f0 52 53 49 53 54 5f 57 41 4c 3b 0a 20 20 20 20 20  RSIST_WAL;.     
1c800 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1c810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c820 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c830 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1c840 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1c850 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1c860 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1c870 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1c880 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1c890 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1c8a0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1c8b0 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1c8c0 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1c8d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1c8e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1c8f0 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1c900 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1c910 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1c920 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1c930 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1c940 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1c950 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1c960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1c980 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c990 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c9a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c9b0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1c9c0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1c9d0 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1c9e0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1c9f0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1ca00 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1ca10 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1ca20 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1ca30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1ca40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1ca50 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1ca60 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 20 20 63 61  PLE__) */.    ca
1ca70 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ca80 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a  SYNC_OMITTED: {.
1ca90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1caa0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 41 20 6e 6f  ITE_OK;  /* A no
1cab0 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  -op */.    }.  }
1cac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cad0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1cae0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1caf0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1cb00 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1cb10 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1cb20 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1cb30 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1cb40 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1cb50 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1cb60 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1cb70 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1cb80 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1cb90 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1cba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1cbb0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1cbc0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1cbd0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1cbe0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1cbf0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1cc00 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1cc10 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1cc20 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1cc30 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1cc40 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1cc50 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1cc60 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1cc70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
1cc80 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1cc90 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1cca0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ccb0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1ccc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1ccd0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1cce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ccf0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
1cd00 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
1cd10 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
1cd20 69 73 20 61 6c 77 61 79 73 20 30 20 66 6f 72 20  is always 0 for 
1cd30 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
1cd40 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1cd50 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1cd60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
1cd70 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1cd80 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1cd90 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1cda0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1cdb0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1cdc0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1cdd0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1cde0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1cdf0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1ce00 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1ce10 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1ce20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1ce30 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1ce40 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1ce50 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1ce60 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1ce70 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1ce80 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1ce90 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1cea0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1ceb0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1cec0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1ced0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1cee0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1cef0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1cf00 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1cf10 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1cf20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1cf30 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1cf40 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1cf50 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1cf60 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1cf70 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1cf80 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1cf90 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1cfa0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1cfb0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1cfc0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1cfd0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1cfe0 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1cff0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1d000 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1d010 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1d020 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1d030 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1d040 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1d050 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1d060 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1d070 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1d080 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1d090 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1d0a0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1d0b0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1d0c0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1d0d0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1d0e0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1d0f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1d100 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1d110 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1d120 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1d130 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1d140 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1d150 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1d160 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1d170 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1d180 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1d190 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1d1a0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1d1b0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1d1c0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1d1d0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1d1e0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1d1f0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1d200 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1d210 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1d220 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1d230 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1d240 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1d250 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1d260 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1d270 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1d280 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1d290 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1d2a0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1d2b0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1d2c0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1d2d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1d2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1d2f0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1d300 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1d330 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1d340 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d360 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1d370 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1d380 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3a0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1d3b0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
1d3c0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
1d3d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d3e0 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
1d3f0 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
1d400 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1d410 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
1d420 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d430 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1d440 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1d450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d460 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
1d470 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1d480 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
1d490 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1d4a0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
1d4b0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
1d4c0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
1d4d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d4e0 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
1d4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d500 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1d510 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1d520 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
1d530 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1d540 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
1d550 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
1d560 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d580 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
1d590 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
1d5a0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1d5b0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1d5c0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1d5d0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1d5e0 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1d5f0 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1d600 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1d610 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1d620 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1d630 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1d640 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1d650 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1d660 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1d670 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1d680 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
1d690 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
1d6a0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
1d6b0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
1d6c0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
1d6d0 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
1d6e0 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1d6f0 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1d700 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1d710 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1d720 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
1d730 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
1d740 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
1d750 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1d760 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1d770 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
1d780 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1d790 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
1d7a0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1d7b0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
1d7c0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7e0 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1d7f0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
1d800 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
1d810 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d820 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1d830 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1d840 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
1d850 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
1d860 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1d870 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1d880 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1d890 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1d8a0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1d8b0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1d8c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1d8d0 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
1d8e0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1d8f0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1d900 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1d910 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
1d920 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
1d930 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
1d940 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
1d950 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
1d960 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
1d970 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1d980 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1d990 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1d9a0 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
1d9b0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
1d9c0 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
1d9d0 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
1d9e0 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
1d9f0 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
1da00 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
1da10 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
1da20 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
1da30 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
1da40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1da50 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
1da60 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
1da70 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
1da80 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
1da90 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
1daa0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1dab0 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
1dac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
1dad0 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
1dae0 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
1daf0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1db00 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
1db10 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
1db20 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
1db30 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
1db40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1db50 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
1db60 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
1db70 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
1db80 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
1db90 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
1dba0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
1dbb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1dbc0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1dbd0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
1dbe0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1dbf0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
1dc00 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1dc10 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1dc20 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1dc30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1dc40 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
1dc50 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
1dc60 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
1dc70 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
1dc80 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
1dc90 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
1dca0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1dcb0 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
1dcc0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
1dcd0 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
1dce0 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
1dcf0 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
1dd00 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
1dd10 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
1dd20 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
1dd30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
1dd40 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
1dd50 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
1dd60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
1dd70 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
1dd80 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
1dd90 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
1dda0 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
1ddb0 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
1ddc0 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
1ddd0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
1dde0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
1ddf0 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
1de00 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
1de10 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1de20 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
1de30 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
1de40 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
1de50 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
1de60 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
1de70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
1de80 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
1de90 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
1dea0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
1deb0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
1dec0 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
1ded0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dee0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
1def0 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
1df00 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
1df10 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
1df20 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1df30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1df40 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
1df50 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
1df60 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
1df70 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
1df80 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
1df90 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
1dfa0 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
1dfb0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1dfc0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1dfd0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1dfe0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
1dff0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1e010 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
1e020 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
1e030 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
1e040 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
1e050 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
1e060 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
1e070 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1e080 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1e090 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e0a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e0b0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1e0c0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
1e0d0 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
1e0e0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
1e0f0 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
1e100 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
1e110 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
1e120 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
1e130 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
1e140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1e150 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
1e160 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
1e170 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
1e180 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
1e190 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
1e1a0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1e1b0 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
1e1c0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
1e1d0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1e1e0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
1e1f0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
1e200 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1e210 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
1e220 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
1e230 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
1e240 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1e250 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1e260 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
1e270 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
1e280 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
1e290 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e2a0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
1e2b0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
1e2c0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
1e2d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
1e2e0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
1e2f0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
1e300 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
1e310 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
1e320 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
1e330 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
1e340 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
1e350 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
1e360 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
1e370 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e380 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
1e390 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
1e3a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1e3b0 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
1e3c0 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
1e3d0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
1e3e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1e3f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1e400 20 20 6d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65    munmap(p->apRe
1e410 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
1e420 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
1e430 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e440 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1e450 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
1e460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1e470 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
1e480 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
1e490 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
1e4a0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
1e4b0 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
1e4c0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
1e4d0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
1e4e0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
1e4f0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
1e500 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
1e510 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1e520 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
1e530 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
1e540 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
1e550 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
1e560 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1e570 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
1e580 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
1e590 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
1e5a0 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
1e5b0 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
1e5c0 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
1e5d0 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
1e5e0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1e5f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
1e600 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
1e610 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
1e620 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
1e630 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
1e640 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
1e650 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1e660 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1e670 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
1e680 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
1e690 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
1e6a0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
1e6b0 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
1e6c0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
1e6d0 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
1e6e0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
1e6f0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
1e700 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
1e710 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
1e720 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
1e730 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
1e740 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
1e750 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
1e760 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
1e770 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
1e780 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
1e790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e7a0 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
1e7b0 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
1e7c0 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
1e7d0 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
1e7e0 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
1e7f0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
1e800 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
1e810 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
1e820 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
1e830 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
1e840 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
1e850 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
1e860 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
1e870 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
1e880 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
1e890 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
1e8a0 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
1e8b0 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
1e8c0 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
1e8d0 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
1e8e0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
1e8f0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
1e900 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
1e910 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
1e920 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
1e930 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
1e940 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1e950 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
1e960 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
1e970 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
1e980 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
1e990 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
1e9a0 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
1e9b0 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
1e9c0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
1e9d0 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
1e9e0 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
1e9f0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
1ea00 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
1ea10 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
1ea20 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
1ea30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
1ea40 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
1ea50 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
1ea60 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1ea70 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
1ea80 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
1ea90 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
1eaa0 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
1eab0 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
1eac0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1ead0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1eae0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1eaf0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1eb00 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1eb10 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1eb20 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1eb30 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1eb40 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1eb50 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1eb60 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1eb70 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1eb80 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1eb90 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
1eba0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1ebb0 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
1ebc0 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
1ebd0 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
1ebe0 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
1ebf0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
1ec00 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
1ec10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ec20 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
1ec30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1ec40 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
1ec50 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
1ec60 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
1ec70 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
1ec80 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
1ec90 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
1eca0 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
1ecb0 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
1ecc0 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
1ecd0 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
1ece0 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
1ecf0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
1ed00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
1ed10 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1ed20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
1ed30 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
1ed40 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
1ed50 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1ed60 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
1ed70 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
1ed80 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1ed90 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
1eda0 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1edb0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1edc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ede0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1edf0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
1ee00 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
1ee10 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
1ee20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
1ee30 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
1ee40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1ee50 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
1ee60 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
1ee70 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee90 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
1eea0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
1eeb0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
1eec0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1eed0 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
1eee0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
1eef0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1ef00 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1ef10 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ef20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1ef30 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1ef40 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
1ef50 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
1ef60 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
1ef70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
1ef80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1ef90 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
1efa0 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
1efb0 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
1efc0 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
1efd0 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
1efe0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1eff0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1f000 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
1f010 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
1f020 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
1f030 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
1f040 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
1f050 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1f060 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1f070 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
1f080 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
1f090 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1f0a0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
1f0b0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
1f0c0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
1f0d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f0e0 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
1f0f0 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
1f100 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
1f110 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
1f120 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
1f130 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
1f140 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
1f150 73 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 65  s. The actual pe
1f160 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 66 69  rmissions the fi
1f170 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 20 20  le is created.  
1f180 20 20 2a 2a 20 77 69 74 68 20 61 72 65 20 73 75    ** with are su
1f190 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 75 72  bject to the cur
1f1a0 72 65 6e 74 20 75 6d 61 73 6b 20 73 65 74 74 69  rent umask setti
1f1b0 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ng..    */.    i
1f1c0 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
1f1d0 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
1f1e0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
1f1f0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
1f200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1f210 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20  RR_FSTAT;.      
1f220 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1f230 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  r;.    }..#ifdef
1f240 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
1f250 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
1f260 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
1f270 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
1f280 54 4f 52 59 29 20 2b 20 33 30 3b 0a 23 65 6c 73  TORY) + 30;.#els
1f290 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
1f2a0 6d 65 20 3d 20 35 20 2b 20 28 69 6e 74 29 73 74  me = 5 + (int)st
1f2b0 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  rlen(pDbFd->zPat
1f2c0 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
1f2d0 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
1f2e0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
1f2f0 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
1f300 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
1f310 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
1f320 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f340 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
1f350 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
1f360 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
1f370 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
1f380 6d 4e 6f 64 65 29 29 3b 0a 20 20 20 20 7a 53 68  mNode));.    zSh
1f390 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
1f3a0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
1f3b0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
1f3c0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
1f3d0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
1f3e0 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
1f3f0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
1f400 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
1f410 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
1f420 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f430 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
1f440 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
1f450 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
1f460 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
1f470 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
1f480 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
1f490 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
1f4a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
1f4b0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
1f4c0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1f4d0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1f4e0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
1f4f0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1f500 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ath, zShmFilenam
1f510 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  e);.#endif.    p
1f520 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
1f530 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
1f540 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
1f550 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
1f560 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
1f570 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
1f580 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
1f590 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1f5a0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1f5b0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
1f5c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1f5d0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1f5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1f5f0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1f600 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1f610 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
1f620 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
1f630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 68  ==0 ){.      pSh
1f640 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
1f650 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
1f660 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
1f670 45 41 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAT,.           
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f      (sStat.st_mo
1f6a0 64 65 20 26 20 30 37 37 37 29 29 3b 0a 20 20 20  de & 0777));.   
1f6b0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1f6c0 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
1f6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 4f 3b  const char *zRO;
1f6e0 0a 20 20 20 20 20 20 20 20 7a 52 4f 20 3d 20 73  .        zRO = s
1f6f0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f700 65 74 65 72 28 70 44 62 46 64 2d 3e 7a 50 61 74  eter(pDbFd->zPat
1f710 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
1f720 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
1f730 7a 52 4f 20 26 26 20 73 71 6c 69 74 65 33 47 65  zRO && sqlite3Ge
1f740 74 42 6f 6f 6c 65 61 6e 28 7a 52 4f 29 20 29 7b  tBoolean(zRO) ){
1f750 0a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e  .          pShmN
1f760 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
1f770 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d  open(zShmFilenam
1f780 65 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 0a 20 20 20  e, O_RDONLY,.   
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20   (sStat.st_mode 
1f7c0 26 20 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20  & 0777));.      
1f7d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
1f7e0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
1f7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f800 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
1f810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1f820 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
1f830 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1f840 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
1f850 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
1f860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1f870 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
1f880 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
1f890 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1f8a0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1f8b0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1f8c0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1f8d0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
1f8e0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
1f8f0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1f900 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
1f910 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f930 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
1f940 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1f950 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
1f960 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
1f970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f980 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1f990 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
1f9a0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
1f9b0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
1f9c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f9d0 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72  RR_SHMOPEN, "ftr
1f9e0 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c  uncate", zShmFil
1f9f0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1fa00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1fa10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fa20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1fa30 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
1fa40 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
1fa50 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  RDLCK, UNIX_SHM_
1fa60 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  DMS, 1);.      }
1fa70 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1fa80 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1fa90 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
1faa0 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1fab0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1fac0 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
1fad0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
1fae0 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
1faf0 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
1fb00 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
1fb10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
1fb20 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
1fb30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
1fb40 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1fb50 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
1fb60 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1fb70 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1fb80 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1fb90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1fba0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1fbb0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1fbc0 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
1fbd0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
1fbe0 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
1fbf0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
1fc00 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
1fc10 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
1fc20 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
1fc30 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
1fc40 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
1fc50 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
1fc60 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
1fc70 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
1fc80 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
1fc90 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
1fca0 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
1fcb0 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
1fcc0 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
1fcd0 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
1fce0 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
1fcf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1fd00 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1fd10 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
1fd20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1fd30 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
1fd40 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
1fd50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fd60 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fd70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fd80 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1fd90 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
1fda0 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
1fdb0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
1fdc0 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
1fdd0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
1fde0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
1fdf0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
1fe00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1fe10 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1fe20 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
1fe30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fe40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fe50 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
1fe60 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
1fe70 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
1fe80 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1fe90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1feb0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1fec0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
1fed0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1fee0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1fef0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1ff00 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1ff10 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
1ff20 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
1ff30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1ff40 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1ff50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1ff60 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
1ff70 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
1ff80 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
1ff90 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
1ffa0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
1ffb0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1ffc0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
1ffd0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1ffe0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
1fff0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
20000 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
20010 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
20020 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
20030 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
20040 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
20050 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
20060 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
20070 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
20080 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
20090 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
200a0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
200b0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
200c0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
200d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
200e0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
200f0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
20100 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
20110 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
20120 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
20130 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
20140 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
20150 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
20160 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
20170 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
20180 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
20190 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
201a0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
201b0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
201c0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
201d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
201e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
201f0 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
20200 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20220 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
20230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20240 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
20270 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
20280 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
202a0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
202b0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
202c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
202d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
202e0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
202f0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
20300 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
20310 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
20320 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
20330 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
20340 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
20350 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
20360 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
20370 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
20380 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
20390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
203a0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
203b0 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e  emory file has n
203c0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
203d0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
203e0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d   */.  if( pDbFd-
203f0 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >pShm==0 ){.    
20400 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61  rc = unixOpenSha
20410 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
20420 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20430 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
20440 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20   rc;.  }..  p = 
20450 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70  pDbFd->pShm;.  p
20460 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
20470 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33  mNode;.  sqlite3
20480 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
20490 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
204a0 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
204b0 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
204c0 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
204d0 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
204e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
204f0 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
20500 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
20510 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
20520 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
20530 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
20540 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
20550 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
20560 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
20570 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
20580 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ck==0 );..  if( 
20590 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
205a0 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
205b0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
205e0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
205f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
20600 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
20610 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
20620 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
20630 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
20640 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20660 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
20670 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
20680 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
20690 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
206a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
206b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
206c0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
206d0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
206e0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
206f0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
20700 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
20710 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
20720 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20730 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
20740 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
20750 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
20760 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
20770 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
20780 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
20790 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
207a0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
207b0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
207c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
207d0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
207e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
207f0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
20800 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
20810 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
20820 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
20830 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
20840 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
20850 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
20860 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
20870 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
20880 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
20890 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
208a0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
208b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
208c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
208d0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
208e0 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69  ly, if bExtend i
208f0 73 20 74 72 75 65 2c 20 75 73 65 20 66 74 72 75  s true, use ftru
20900 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
20910 61 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ate.        ** t
20920 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
20930 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
20940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20950 66 28 20 21 62 45 78 74 65 6e 64 20 29 20 67 6f  f( !bExtend ) go
20960 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20970 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
20980 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
20990 6d 4e 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29  mNode->h, nByte)
209a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
209b0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
209c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
209d0 53 49 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65  SIZE, "ftruncate
209e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20a00 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
20a10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
20a20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20a50 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
20a60 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20a70 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
20a80 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
20a90 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
20aa0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
20ab0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
20ac0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
20ad0 70 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  pRegion, (iRegio
20ae0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72  n+1)*sizeof(char
20af0 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   *).    );.    i
20b00 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
20b10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
20b20 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
20b30 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
20b40 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
20b50 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
20b60 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
20b70 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ile(pShmNode->nR
20b80 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b  egion<=iRegion){
20b90 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
20ba0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
20bb0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
20bc0 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6d 6d         pMem = mm
20bd0 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a  ap(0, szRegion,.
20be0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
20bf0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
20c00 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
20c10 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
20c20 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
20c30 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
20c40 68 6d 4e 6f 64 65 2d 3e 68 2c 20 70 53 68 6d 4e  hmNode->h, pShmN
20c50 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
20c60 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
20c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20c80 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
20c90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20ca0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
20cb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
20cc0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
20cd0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
20ce0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
20cf0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
20d00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
20d10 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
20d20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
20d30 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
20d40 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
20d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20d60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
20d70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
20d80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
20da0 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
20db0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
20dc0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20dd0 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
20de0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70  de->nRegion] = p
20df0 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Mem;.      pShmN
20e00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
20e10 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
20e20 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
20e30 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
20e40 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a  iRegion ){.    *
20e50 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  pp = pShmNode->a
20e60 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  pRegion[iRegion]
20e70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
20e80 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  pp = 0;.  }.  if
20e90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
20ea0 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51  adonly && rc==SQ
20eb0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
20ec0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
20ed0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20ee0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
20ef0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
20f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
20f10 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
20f20 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
20f30 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
20f40 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20f50 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
20f60 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
20f70 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
20f80 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
20f90 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
20fa0 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
20fb0 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
20fc0 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
20fd0 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
20fe0 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
20ff0 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
21000 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
21010 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
21020 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
21030 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
21040 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
21050 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
21060 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
21070 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
21080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21090 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
210a0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
210b0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
210c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
210d0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
210f0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
21100 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
21110 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21130 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
21140 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
21150 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
21160 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
21170 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
21180 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
21190 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
211a0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
211b0 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
211c0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
211d0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
211e0 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
211f0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
21200 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
21210 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
21220 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
21230 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
21240 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
21250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21260 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
21270 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
21280 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
21290 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
212a0 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
212b0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
212c0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
212d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
21300 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
21330 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
21340 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
21350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
21360 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
21370 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
21380 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21390 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
213a0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
213b0 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
213c0 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
213d0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
213e0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
213f0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
21400 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
21410 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
21420 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
21430 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
21440 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
21450 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
21460 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
21470 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
21480 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
21490 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
214a0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
214b0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
214c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
214d0 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
214e0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
214f0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
21500 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
21510 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
21520 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
21530 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
21540 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
21550 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
21560 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
21570 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
21580 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
21590 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
215a0 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
215b0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
215c0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
215d0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
215e0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
215f0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
21600 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
21610 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
21620 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
21630 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
21640 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
21650 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
21660 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
21670 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
21680 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
21690 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
216a0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
216b0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
216c0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
216d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
216e0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
216f0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
21700 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
21710 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
21720 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
21730 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
21740 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
21750 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
21760 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
21770 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
21780 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
21790 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
217a0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
217b0 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
217c0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
217d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
217e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
217f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21800 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
21810 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
21820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21830 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
21840 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
21850 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
21860 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
21870 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
21880 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
21890 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
218a0 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
218b0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
218c0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
218d0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
218e0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
218f0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
21900 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
21910 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
21920 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
21930 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
21940 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
21950 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
21960 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
21970 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
21980 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
21990 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
219a0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
219b0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
219c0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
219d0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
219e0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
219f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21a00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21a20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
21a30 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
21a40 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
21a50 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
21a60 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
21a70 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
21a80 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
21a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21aa0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
21ab0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
21ac0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21ad0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
21ae0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
21af0 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
21b00 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
21b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21b20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21b30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
21b40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
21b50 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
21b60 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
21b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21b80 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
21b90 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
21ba0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21bb0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
21bc0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
21bd0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
21be0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
21bf0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
21c00 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
21c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
21c20 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
21c30 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
21c40 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
21c50 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
21c60 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
21c70 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
21c80 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
21c90 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
21ca0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
21cb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
21cc0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
21cd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21ce0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
21cf0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
21d00 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
21d10 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
21d20 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
21d30 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
21d40 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
21d50 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
21d60 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
21d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
21d90 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21da0 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
21db0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
21dc0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
21dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
21df0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
21e00 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
21e10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
21e20 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
21e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21e40 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
21e50 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
21e60 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
21e70 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
21e80 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
21e90 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
21ea0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
21eb0 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
21ec0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
21ed0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
21ee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ef0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
21f00 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
21f10 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
21f20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
21f30 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
21f40 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
21f50 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
21f60 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
21f70 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
21f80 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
21f90 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
21fa0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
21fb0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
21fc0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
21fd0 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
21fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
21ff0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
22000 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
22010 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
22020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
22030 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
22040 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
22050 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
22060 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
22070 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
22080 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
22090 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
220a0 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
220b0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
220c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
220d0 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
220e0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
220f0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
22100 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
22110 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
22120 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
22130 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22140 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
22150 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22170 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
22180 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22190 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
221c0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
221d0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
221e0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
221f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22200 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
22210 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
22220 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
22230 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
22240 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
22250 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
22260 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
22270 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
22280 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
22290 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
222a0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
222b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
222c0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
222d0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
222e0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
222f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
22300 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
22310 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
22320 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
22330 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22340 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
22350 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
22360 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
22370 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
22380 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
22390 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
223a0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
223b0 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
223c0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
223d0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
223e0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
223f0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
22400 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
22410 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
22420 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
22430 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
22440 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
22450 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
22460 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
22470 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
22480 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
22490 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
224a0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
224b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
224c0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
224d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
224e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
224f0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
22500 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
22510 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
22520 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
22530 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
22540 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
22550 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
22560 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
22570 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
22580 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
22590 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
225a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
225b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
225c0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
225d0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73  mNode->h>=0 ) os
225e0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
225f0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
22600 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
22610 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
22620 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
22630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22640 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
22650 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
22660 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
22670 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
22680 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
22690 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
226a0 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
226b0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
226c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
226d0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
226e0 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
226f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
22700 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
22710 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
22720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22730 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
22740 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
22750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
22770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
227c0 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
227d0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  on contains defi
227e0 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74  nitions of sqlit
227f0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
22800 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d  jects that.** im
22810 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20  plement various 
22820 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  file locking str
22830 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73  ategies.  It als
22840 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  o contains defin
22850 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69  itions.** of "fi
22860 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e  nder" functions.
22870 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74    A finder-funct
22880 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ion is used to l
22890 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70  ocate the approp
228a0 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33  riate.** sqlite3
228b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
228c0 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ct for a particu
228d0 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  lar database fil
228e0 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  e.  The pAppData
228f0 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
22900 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53   sqlite3_vfs VFS
22910 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69   objects are ini
22920 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70  tialized to be p
22930 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68  ointers to.** th
22940 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72  e correct finder
22950 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68  -function for th
22960 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  at VFS..**.** Mo
22970 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  st finder functi
22980 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ons return a poi
22990 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20  nter to a fixed 
229a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
229b0 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54  ds.** object.  T
229c0 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  he only interest
229d0 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  ing finder-funct
229e0 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49  ion is autolockI
229f0 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a  oFinder, which.*
22a00 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66  * looks at the f
22a10 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61  ilesystem type a
22a20 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73  nd tries to gues
22a30 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  s the best locki
22a40 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66  ng.** strategy f
22a50 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20  rom that..**.** 
22a60 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69  For finder-funti
22a70 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
22a80 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
22a90 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
22aa0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
22ab0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
22ac0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
22ad0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
22ae0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
22af0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
22b00 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
22b10 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
22b20 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
22b30 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
22b40 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
22b50 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
22b60 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
22b70 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
22b80 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
22b90 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
22ba0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
22bb0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
22bc0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
22bd0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
22be0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
22bf0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
22c00 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
22c10 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
22c20 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
22c30 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
22c40 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
22c50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
22c60 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
22c70 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
22c80 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
22c90 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
22ca0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
22cb0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
22cc0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
22cd0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
22ce0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
22cf0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
22d00 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
22d10 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
22d20 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
22d30 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
22d40 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
22d50 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20  FINDER, METHOD, 
22d60 56 45 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20  VERSION, CLOSE, 
22d70 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
22d80 4c 4f 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61  LOCK)      \.sta
22d90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
22da0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
22db0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
22de0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
22df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
22e00 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
22e30 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
22e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
22e50 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
22e80 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
22ea0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
22ed0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
22ef0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
22f20 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
22f30 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
22f40 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
22f70 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
22f80 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
22f90 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
22fc0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
22fd0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
22fe0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
230d0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
23100 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
23110 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
23120 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23140 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
23150 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
23160 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
23170 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
23190 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
231a0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
231b0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
231c0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
231e0 20 20 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20    unixShmMap,   
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
23230 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23250 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
23280 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
23290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
232a0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
232d0 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  nixShmUnmap     
232e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
232f0 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
23320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
23370 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
23380 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
23390 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
233a0 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
233b0 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
233c0 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
233d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
233e0 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
23410 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
234b0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
234c0 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
234d0 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
234e0 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
234f0 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
23500 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
23510 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
23520 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
23530 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
23540 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
23550 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
23560 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
23570 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
23580 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
23590 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
235a0 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
235b0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
235c0 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
235d0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
235e0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
235f0 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
23600 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
23610 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
23620 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
23630 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23650 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
23660 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  s enabled */.  u
23670 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
23680 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23690 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
236a0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
236b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
236c0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
236d0 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
236e0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
236f0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
23700 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
23710 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
23720 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
23730 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
23740 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
23750 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
23760 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
23770 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
23780 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
23790 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
237a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
237b0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
237c0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
237d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
237e0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
237f0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
23800 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
23810 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
23820 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
23830 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
23840 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
23850 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
23860 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
23870 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23880 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
23890 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
238a0 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
238b0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
238c0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
238d0 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
238e0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
238f0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
23900 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
23910 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
23920 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
23930 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
23940 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
23970 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
23980 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
23990 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
239a0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
239b0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
239c0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
239d0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
239e0 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
239f0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
23a00 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
23a10 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
23a20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
23a30 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
23a40 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
23a50 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
23a60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23a70 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
23a80 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
23a90 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23ab0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
23ac0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
23ad0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
23ae0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
23af0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
23b00 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
23b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
23b30 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
23b40 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
23b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23b60 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
23b70 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
23ba0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
23bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23bc0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
23bd0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
23be0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
23bf0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23c00 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
23c10 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
23c20 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
23c30 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
23c40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23c50 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
23c60 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
23c70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
23c80 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23c90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
23ca0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
23cd0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
23ce0 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
23cf0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
23d00 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
23d10 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
23d20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
23d30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
23d40 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
23d50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23d60 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
23d70 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
23d80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
23d90 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
23da0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
23db0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
23dc0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
23dd0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
23de0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23df0 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
23e00 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
23e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23e20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
23e30 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
23e40 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
23e50 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
23e60 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
23e70 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
23ea0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
23eb0 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ed0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
23ee0 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f00 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
23f10 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f30 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
23f40 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
23f50 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
23f60 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
23f70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
23f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
23f90 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
23fa0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
23fb0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
23fc0 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
23fd0 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
23fe0 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
23ff0 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
24000 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
24010 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
24020 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
24030 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
24040 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
24050 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
24060 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
24070 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
24080 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
24090 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
240a0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
240b0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
240c0 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
240d0 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
240e0 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
240f0 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
24100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
24110 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
24120 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
24130 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
24140 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
24150 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
24160 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
24170 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
24180 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24190 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
241a0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
241b0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
241c0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
241d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
241e0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
241f0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
24200 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
24210 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
24220 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
24230 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
24240 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
24250 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
24260 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
24270 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
24280 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
24290 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
242a0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
242b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
242c0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
242d0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
242e0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
242f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
24300 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
24310 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
24320 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
24330 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
24340 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
24350 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
24360 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24370 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
24380 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
24390 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
243a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
243b0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
243c0 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
243d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
243e0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
243f0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
24400 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
24410 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
24420 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
24430 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
24440 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
24450 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
24460 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
24470 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
24480 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244a0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
244b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
244c0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
244d0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
244e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
244f0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
24520 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
24530 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
24540 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
24550 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
24560 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
24570 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24580 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
24590 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
245a0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
245b0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
245c0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
245d0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
245e0 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
245f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
24600 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
24610 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
24620 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
24630 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24640 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
24650 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
24660 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
24670 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24680 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
24690 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
246a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
246b0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
246c0 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
246d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
246e0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
246f0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
24700 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
24710 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
24720 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
24730 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24740 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
24750 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
24760 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
24770 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
24780 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
24790 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
247a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
247b0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
247c0 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
247d0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
247e0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
247f0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
24800 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
24810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
24820 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
24830 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
24840 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
24850 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
24860 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
24870 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
24880 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
24890 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
248a0 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
248b0 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
248c0 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
248d0 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
248e0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
248f0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
24900 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
24910 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
24920 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
24930 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
24940 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
24950 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
24960 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
24970 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
24980 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
24990 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
249a0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
249b0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
249c0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
249d0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
249e0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
249f0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
24a00 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
24a10 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24a20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
24a30 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
24a40 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
24a50 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
24a60 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
24a70 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
24a80 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
24a90 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
24aa0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
24ab0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
24ac0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
24ad0 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
24ae0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
24af0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
24b00 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
24b10 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
24b20 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
24b30 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
24b40 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
24b50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24b60 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
24b70 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
24b80 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
24b90 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
24ba0 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
24bb0 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
24bc0 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
24bd0 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
24be0 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
24bf0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
24c00 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
24c10 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
24c20 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
24c30 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
24c40 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
24c50 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
24c60 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
24c70 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
24c80 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
24c90 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
24ca0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
24cb0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
24cc0 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
24cd0 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
24ce0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24cf0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
24d00 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
24d10 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
24d20 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
24d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
24d40 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
24d50 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
24d60 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
24d70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
24d80 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
24d90 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
24da0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
24db0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
24dc0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
24dd0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
24de0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
24df0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24e00 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
24e10 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
24e20 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24e30 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
24e40 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
24e50 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
24e60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
24e70 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
24e80 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
24e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24ea0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
24eb0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
24ec0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
24ed0 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
24ee0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
24ef0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
24f00 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
24f10 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
24f20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
24f30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
24f40 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
24f50 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
24f60 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
24f70 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
24f80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24f90 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
24fa0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
24fb0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
24fc0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
24fd0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
24fe0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
24ff0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
25000 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
25010 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
25020 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
25030 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
25040 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
25050 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25060 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
25070 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
25080 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
25090 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
250a0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
250b0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
250c0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
250d0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
250e0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
250f0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
25100 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
25110 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
25120 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
25130 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
25140 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
25150 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
25160 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
25170 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
25180 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
25190 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
251a0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
251b0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
251c0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
251d0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
251e0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
251f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
25200 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
25210 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
25220 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
25230 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
25240 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
25250 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
25260 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
25270 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
25280 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
25290 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
252a0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
252b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
252c0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
252d0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
252e0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
252f0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
25300 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
25310 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
25320 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
25330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25370 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
25390 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
253a0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
253b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
253d0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
253e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
253f0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
25400 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
25410 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
25420 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
25430 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25440 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
25450 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
25460 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
25470 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
25480 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
25490 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
254a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
254b0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
254c0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
254d0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
254e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
254f0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
25500 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ned */.  int syn
25510 63 44 69 72 2c 20 20 20 20 20 20 20 20 20 20 20  cDir,           
25520 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 79 6e 63   /* True to sync
25530 20 64 69 72 65 63 74 6f 72 79 20 6f 6e 20 66 69   directory on fi
25540 72 73 74 20 73 79 6e 63 20 2a 2f 0a 20 20 73 71  rst sync */.  sq
25550 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
25560 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
25570 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
25580 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
25590 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
255a0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
255b0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
255c0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
255d0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 2c 20 20 20 20   int noLock,    
255e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
255f0 20 6c 6f 63 6b 69 6e 67 20 69 66 20 74 72 75 65   locking if true
25600 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 65 6c 65   */.  int isDele
25610 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
25620 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
25630 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
25640 74 20 69 73 52 65 61 64 4f 6e 6c 79 20 20 20 20  t isReadOnly    
25650 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25660 20 74 68 65 20 66 69 6c 65 20 69 73 20 6f 70 65   the file is ope
25670 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  ned read-only */
25680 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  .){.  const sqli
25690 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
256a0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
256b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
256c0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49  = (unixFile *)pI
256d0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
256e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
256f0 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  rt( pNew->pInode
25700 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20  ==NULL );..  /* 
25710 50 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65  Parameter isDele
25720 74 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  te is only used 
25730 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72  on vxworks. Expr
25740 65 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69  ess this explici
25750 74 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74  tly .  ** here t
25760 6f 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c  o prevent compil
25770 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75  er warnings abou
25780 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74  t unused paramet
25790 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ers..  */.  UNUS
257a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
257b0 65 6c 65 74 65 29 3b 0a 0a 20 20 2f 2a 20 55 73  elete);..  /* Us
257c0 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
257d0 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
257e0 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
257f0 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
25800 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
25810 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
25820 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
25830 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
25840 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
25850 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
25860 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
25870 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
25880 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25890 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
258a0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
258b0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
258c0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
258d0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
258e0 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
258f0 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
25900 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
25910 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
25920 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
25930 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
25940 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53   );.#endif..  OS
25950 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
25960 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
25970 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
25980 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
25990 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
259a0 6e 61 6d 65 3b 0a 20 20 69 66 28 20 6d 65 6d 63  name;.  if( memc
259b0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
259c0 75 6e 69 78 2d 65 78 63 6c 22 2c 31 30 29 3d 3d  unix-excl",10)==
259d0 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
259e0 74 72 6c 46 6c 61 67 73 20 3d 20 55 4e 49 58 46  trlFlags = UNIXF
259f0 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 65 6c 73  ILE_EXCL;.  }els
25a00 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  e{.    pNew->ctr
25a10 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a  lFlags = 0;.  }.
25a20 20 20 69 66 28 20 69 73 52 65 61 64 4f 6e 6c 79    if( isReadOnly
25a30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
25a40 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
25a50 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25a60 20 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 7b    if( syncDir ){
25a70 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
25a80 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
25a90 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 0a 23  _DIRSYNC;.  }..#
25aa0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
25ab0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
25ac0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
25ad0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
25ae0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
25af0 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
25b00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25b10 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
25b20 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
25b30 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
25b40 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
25b50 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
25b60 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
25b70 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
25b80 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
25b90 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
25ba0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
25bb0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25bc0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
25bd0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
25be0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
25bf0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
25c00 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
25c10 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
25c20 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
25c30 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
25c40 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
25c50 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
25c60 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
25c70 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
25c80 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
25c90 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
25ca0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
25cb0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
25cc0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
25cd0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
25ce0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
25cf0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
25d00 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
25d10 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
25d20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25d30 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
25d40 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
25d50 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
25d60 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
25d70 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
25d80 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
25d90 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
25da0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
25db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
25dd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25de0 75 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  ured in findInod
25df0 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
25e00 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
25e10 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
25e20 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
25e30 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
25e40 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
25e50 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
25e60 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
25e70 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
25e80 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
25e90 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
25ea0 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
25eb0 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
25ec0 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
25ed0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
25ee0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
25ef0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
25f00 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
25f10 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
25f20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
25f30 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
25f40 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
25f50 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
25f60 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
25f70 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
25f80 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
25f90 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
25fa0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
25fb0 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
25fc0 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
25fd0 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
25fe0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
25ff0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
26000 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
26010 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
26020 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
26030 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
26040 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
26050 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
26060 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
26070 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
26080 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
26090 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
260a0 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
260b0 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
260c0 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
260d0 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
260e0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
260f0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
26100 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
26110 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
26120 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
26130 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
26140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
26150 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
26160 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
26170 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
26180 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
26190 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
261a0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
261b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
261c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
261d0 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
261e0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
261f0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
26200 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
26210 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
26220 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
26230 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
26240 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
26250 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
26260 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
26270 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
26280 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
26290 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
262a0 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
262b0 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
262c0 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
262d0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
262e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
262f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
26300 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
26310 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
26320 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
26330 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
26340 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
26350 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
26360 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
26370 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
26380 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
26390 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
263a0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
263b0 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
263c0 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
263d0 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
263e0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
263f0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
26400 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
26410 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
26420 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
26430 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
26440 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
26450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26470 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
26480 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
26490 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
264a0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
264b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
264c0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
264d0 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
264e0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
264f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26500 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
26510 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
26520 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
26530 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
26540 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
26550 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
26560 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
26570 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
26580 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
26590 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
265a0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
265b0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
265c0 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
265d0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
265e0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
265f0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
26600 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
26610 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
26620 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
26630 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
26640 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
26650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
26670 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
26680 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
26690 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
266a0 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
266b0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
266c0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
266d0 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
266e0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
266f0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
26700 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
26710 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
26720 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
26730 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
26740 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
26750 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
26760 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
26770 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
26780 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
26790 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
267a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
267b0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
267c0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
267d0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
267e0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
267f0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
26800 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
26810 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
26820 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
26830 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
26840 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
26850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
26860 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
26870 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
26880 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
268b0 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
268c0 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
268d0 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
268e0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
268f0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
26900 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
26910 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
26920 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
26930 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
26940 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
26950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
26960 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
26970 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
26980 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26990 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
269a0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
269b0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
269c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
269d0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
269e0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
269f0 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c  dif.  .  pNew->l
26a00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69  astErrno = 0;.#i
26a10 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
26a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a30 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
26a40 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
26a50 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
26a60 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
26a70 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
26a80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73 44  lename);.    isD
26a90 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  elete = 0;.  }. 
26aa0 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65 20   pNew->isDelete 
26ab0 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e 64  = isDelete;.#end
26ac0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
26ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26ae0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
26af0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
26b00 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
26b10 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
26b20 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
26b30 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
26b40 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
26b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26b60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26b70 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
26b80 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
26b90 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
26ba0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
26bb0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
26bc0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
26bd0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
26be0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
26bf0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
26c00 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
26c10 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
26c20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
26c30 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
26c40 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
26c50 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
26c60 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
26c70 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
26c80 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
26c90 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
26ca0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
26cb0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
26cc0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
26cd0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
26ce0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
26cf0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
26d00 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
26d10 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
26d20 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
26d30 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
26d40 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
26d50 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
26d60 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
26d70 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
26d80 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
26d90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
26da0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
26db0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26dc0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
26dd0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
26de0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
26df0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
26e00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26e10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
26e20 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
26e30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
26e40 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
26e50 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
26e60 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26e70 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
26e80 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
26e90 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
26ea0 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
26eb0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
26ec0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
26ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26ee0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
26ef0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
26f00 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
26f10 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
26f20 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
26f30 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
26f40 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
26f50 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
26f60 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
26f70 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
26f80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
26f90 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
26fa0 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
26fb0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
26fc0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
26fd0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
26fe0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
26ff0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
27000 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
27010 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
27020 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
27030 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
27040 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
27050 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
27060 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
27070 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
27080 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
27090 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
270a0 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
270b0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
270c0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
270d0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
270e0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
270f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
27100 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
27110 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
27120 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
27130 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
27140 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
27150 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
27160 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
27170 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
27180 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27190 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
271a0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
271b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
271c0 2d 31 37 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -17, zBuf, "%s/"
271d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
271e0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
271f0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
27200 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
27210 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
27220 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
27230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27240 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
27250 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
27260 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
27270 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
27280 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
27290 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
272a0 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
272b0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
272c0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
272d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
272e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
272f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
27300 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
27310 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
27320 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
27330 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
27340 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
27350 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
27360 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
27370 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
27380 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
27390 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
273a0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
273b0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
273c0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
273d0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
273e0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
273f0 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
27400 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
27410 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
27420 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
27430 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
27440 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
27450 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
27460 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
27470 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
27480 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
27490 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
274a0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
274b0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
274c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
274d0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
274e0 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
274f0 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
27500 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
27510 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
27520 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
27530 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
27540 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
27550 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
27560 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
27570 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
27580 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
27590 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
275a0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
275b0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
275c0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
275d0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
275e0 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
275f0 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
27600 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
27610 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
27620 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
27630 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
27640 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
27650 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
27660 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
27670 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
27680 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
27690 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
276a0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
276b0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
276c0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
276d0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
276e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
276f0 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
27700 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
27710 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
27720 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
27730 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
27740 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
27750 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
27760 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
27770 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
27780 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
27790 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
277a0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
277b0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
277c0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
277d0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
277e0 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
277f0 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
27800 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
27810 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
27820 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
27830 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
27840 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
27850 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
27860 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
27870 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
27880 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
27890 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
278a0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
278b0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
278c0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
278d0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
278e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
278f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
27900 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
27910 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
27920 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
27930 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
27940 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
27950 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
27960 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
27970 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
27980 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
27990 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
279a0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
279b0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
279c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
279d0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
279e0 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
279f0 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
27a00 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
27a10 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
27a20 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
27a30 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
27a40 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
27a50 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
27a60 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
27a70 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
27a80 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
27a90 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
27aa0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
27ab0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
27ac0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
27ad0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
27ae0 6f 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66  or a resusable f
27af0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
27b00 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
27b10 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
27b20 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
27b30 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
27b40 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
27b50 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
27b60 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
27b70 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
27b80 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
27b90 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
27ba0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
27bb0 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
27bc0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
27bd0 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
27be0 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
27bf0 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
27c00 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
27c10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
27c20 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
27c30 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
27c40 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
27c50 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
27c60 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
27c70 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
27c80 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
27c90 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
27ca0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
27cb0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
27cc0 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
27cd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
27ce0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
27cf0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
27d00 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
27d10 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
27d20 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
27d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
27d40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27d50 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
27d60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
27d70 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
27d80 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
27d90 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
27da0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
27db0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
27dc0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
27dd0 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
27de0 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
27df0 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
27e00 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
27e10 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
27e20 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
27e30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
27e40 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
27e50 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
27e60 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
27e70 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
27e80 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
27e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
27ea0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
27eb0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
27ec0 66 69 6c 65 2c 20 69 74 20 69 73 20 61 6c 77 61  file, it is alwa
27ed0 79 73 20 63 72 65 61 74 65 64 20 77 69 74 68 0a  ys created with.
27ee0 2a 2a 20 74 68 65 20 6f 63 74 61 6c 20 70 65 72  ** the octal per
27ef0 6d 69 73 73 69 6f 6e 73 20 30 36 30 30 20 28 72  missions 0600 (r
27f00 65 61 64 2f 77 72 69 74 61 62 6c 65 20 62 79 20  ead/writable by 
27f10 6f 77 6e 65 72 20 6f 6e 6c 79 29 2e 20 49 66 20  owner only). If 
27f20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
27f30 20 64 61 74 61 62 61 73 65 20 6f 72 20 6d 61 73   database or mas
27f40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
27f50 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
27f60 77 69 74 68 20 74 68 65 20 70 65 72 6d 69 73 73  with the permiss
27f70 69 6f 6e 73 20 0a 2a 2a 20 6d 61 73 6b 20 53 51  ions .** mask SQ
27f80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
27f90 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 2e 0a 2a  E_PERMISSIONS..*
27fa0 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  *.** Finally, if
27fb0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
27fc0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
27fd0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
27fe0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
27ff0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
28000 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
28010 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
28020 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
28030 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
28040 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
28050 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
28060 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
28070 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
28080 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
28090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
280a0 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
280b0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
280c0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
280d0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
280e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
280f0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
28100 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
28110 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
28120 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
28130 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
28140 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
28150 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
28160 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
28170 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
28180 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
28190 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
281a0 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
281b0 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
281c0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
281d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
281e0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
281f0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
28200 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
28210 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
28220 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
28230 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
28240 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
28270 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
28280 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
28290 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
282c0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
282d0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 29 7b 0a 20  ile with */.){. 
282e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
282f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
28300 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
28310 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 53 51  */.  *pMode = SQ
28320 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
28330 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
28340 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
28350 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
28360 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
28370 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
28380 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
28390 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
283a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
283b0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
283c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
283d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
283e0 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
283f0 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
28400 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
28410 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28420 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
28430 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
28440 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
28450 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
28460 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
28470 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
28480 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
28490 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
284a0 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
284b0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
284c0 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
284d0 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
284e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
284f0 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
28500 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
28510 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
28520 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
28530 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
28540 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
28550 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
28560 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
28570 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
28580 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
28590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
285a0 65 20 4e 4e 20 69 73 20 61 20 34 20 64 69 67 69  e NN is a 4 digi
285b0 74 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  t decimal number
285c0 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
285d0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
285e0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
285f0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
28600 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
28610 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
28620 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
28630 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
28640 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
28650 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
28660 20 6e 44 62 3e 30 20 26 26 20 7a 50 61 74 68 5b   nDb>0 && zPath[
28670 6e 44 62 5d 21 3d 27 2d 27 20 26 26 20 7a 50 61  nDb]!='-' && zPa
28680 74 68 5b 6e 44 62 5d 21 3d 27 2f 27 20 29 20 6e  th[nDb]!='/' ) n
28690 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44  Db--;.    if( nD
286a0 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44  b==0 || zPath[nD
286b0 62 5d 3d 3d 27 2f 27 20 29 20 72 65 74 75 72 6e  b]=='/' ) return
286c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
286d0 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61  e.    while( zPa
286e0 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a  th[nDb]!='-' ){.
286f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44        assert( nD
28700 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  b>0 );.      ass
28710 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ert( zPath[nDb]!
28720 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e  ='\n' );.      n
28730 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Db--;.    }.#end
28740 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  if.    memcpy(zD
28750 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a  b, zPath, nDb);.
28760 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27      zDb[nDb] = '
28770 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d  \0';..    if( 0=
28780 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53  =osStat(zDb, &sS
28790 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
287a0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
287b0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
287c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
287d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
287e0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
287f0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
28800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
28810 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
28820 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
28830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
28850 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
28860 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
28870 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
28880 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
28890 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
288a0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
288b0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
288c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
288d0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
288e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
288f0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
28900 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
28910 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
28920 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
28930 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
28940 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
28950 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
28960 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
28970 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
28980 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
28990 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
289a0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
289b0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
289c0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
289d0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
289e0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
289f0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
28a00 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
28a10 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
28a20 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
28a30 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
28a40 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
28a50 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
28a60 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
28a70 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
28a80 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
28a90 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
28aa0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
28ab0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
28ac0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
28ad0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
28ae0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
28af0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
28b00 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
28b10 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
28b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28b30 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
28b40 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28b50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
28b60 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
28b70 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
28b80 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
28b90 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
28ba0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
28bb0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
28bc0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
28bd0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
28be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28bf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
28c00 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
28c10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
28c40 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
28c50 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
28c60 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
28c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
28c80 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
28c90 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
28ca0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
28cb0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
28cc0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
28cd0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28cf0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
28d00 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
28d10 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
28d20 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
28d30 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
28d40 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
28d50 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
28d60 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
28d70 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
28d80 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
28d90 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
28dc0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
28dd0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
28de0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
28df0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
28e00 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
28e10 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
28e20 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
28e30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
28e40 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
28e50 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
28e60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
28e70 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
28e80 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
28e90 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
28ea0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
28eb0 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
28ec0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
28ed0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28ee0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
28ef0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
28f00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
28f10 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
28f20 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
28f30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
28f40 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
28f50 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
28f60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
28f70 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23  PROXY);.#endif.#
28f80 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
28f90 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
28fa0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28fb0 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
28fc0 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e  atfs fsInfo;.#en
28fd0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
28fe0 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
28ff0 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
29000 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
29010 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
29020 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
29030 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
29040 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
29050 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
29060 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
29070 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
29080 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
29090 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
290a0 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
290b0 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  .  */.  int sync
290c0 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20  Dir = (isCreate 
290d0 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
290e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
290f0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
29100 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
29110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
29120 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
29130 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
29140 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20  PEN_WAL.  ));.. 
29150 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
29160 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
29170 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
29180 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
29190 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
291a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
291b0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
291c0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
291d0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
291e0 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
291f0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
29200 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
29210 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
29220 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
29230 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
29240 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
29250 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
29260 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
29270 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
29280 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
29290 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
292a0 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
292b0 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
292c0 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
292d0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
292e0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
292f0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
29300 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
29310 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
29320 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
29330 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
29340 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
29350 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
29360 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
29370 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
29380 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
29390 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
293a0 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
293b0 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
293c0 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
293d0 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
293e0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
293f0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
29400 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
29410 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
29420 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
29430 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
29440 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
29450 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
29460 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
29470 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
29480 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
29490 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
294a0 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
294b0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
294c0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
294d0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
294e0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
294f0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
29500 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
29510 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
29520 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
29530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
29540 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
29550 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
29560 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
29570 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
29580 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
29590 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
295a0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
295b0 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
295c0 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
295d0 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
295e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
295f0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
29600 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
29610 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29620 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
29630 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
29640 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
29650 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
29660 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
29670 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
29680 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
29690 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
296a0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
296b0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
296c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
296d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
296e0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
296f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
29700 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
29710 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
29720 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
29730 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
29740 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
29750 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
29760 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
29770 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
29780 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
29790 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
297a0 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
297b0 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
297c0 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
297d0 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
297e0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
297f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
29800 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
29810 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
29820 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69  nused));.      i
29830 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20  f( !pUnused ){. 
29840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
29850 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
29860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
29870 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
29880 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ed;.  }else if( 
29890 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
298a0 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
298b0 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
298c0 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
298d0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
298e0 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
298f0 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72  lete && !syncDir
29900 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
29910 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  GetTempname(MAX_
29920 50 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70  PATHNAME+1, zTmp
29930 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
29940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29950 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29960 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
29970 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
29980 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
29990 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
299a0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
299b0 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49  r passed to POSI
299c0 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  X function.  ** 
299d0 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75  open(). These mu
299e0 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64  st be calculated
299f0 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20   even if open() 
29a00 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61  is not called, a
29a10 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20  s.  ** they may 
29a20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  be stored as par
29a30 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  t of the file ha
29a40 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79  ndle and used by
29a50 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63   the .  ** 'conc
29a60 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20  h file' locking 
29a70 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20  functions later 
29a80 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  on.  */.  if( is
29a90 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e  Readonly )  open
29aa0 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
29ab0 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  Y;.  if( isReadW
29ac0 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  rite ) openFlags
29ad0 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66   |= O_RDWR;.  if
29ae0 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20  ( isCreate )    
29af0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43  openFlags |= O_C
29b00 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78  REAT;.  if( isEx
29b10 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c  clusive ) openFl
29b20 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f  ags |= (O_EXCL|O
29b30 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70  _NOFOLLOW);.  op
29b40 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41  enFlags |= (O_LA
29b50 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
29b60 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29  );..  if( fd<0 )
29b70 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65  {.    mode_t ope
29b80 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
29b90 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
29ba0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
29bb0 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 72 63  e with */.    rc
29bc0 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c   = findCreateFil
29bd0 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61  eMode(zName, fla
29be0 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 29 3b 0a  gs, &openMode);.
29bf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
29c10 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
29c20 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
29c30 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
29c40 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
29c50 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
29c60 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
29c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
29c90 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
29ca0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
29cb0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
29cc0 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
29cd0 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
29ce0 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
29cf0 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66 28 20  lags));.    if( 
29d00 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
29d10 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
29d20 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
29d30 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sive ){.      /*
29d40 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
29d50 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
29d60 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
29d70 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
29d80 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d  /.      flags &=
29d90 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
29da0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
29db0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
29dc0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d      openFlags &=
29dd0 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41   ~(O_RDWR|O_CREA
29de0 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  T);.      flags 
29df0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
29e00 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f  EADONLY;.      o
29e10 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
29e20 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65  ONLY;.      isRe
29e30 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
29e40 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
29e50 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
29e60 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
29e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
29e80 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
29e90 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
29ea0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
29eb0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
29ec0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  e);.      goto o
29ed0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
29ee0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
29ef0 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
29f00 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
29f10 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
29f20 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
29f30 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20   p->pUnused ){. 
29f40 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66     p->pUnused->f
29f50 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
29f60 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
29f70 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
29f80 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
29f90 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
29fa0 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
29fb0 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69  #else.    osUnli
29fc0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
29fd0 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
29fe0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29ff0 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
2a000 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
2a010 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
2a020 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 46  #endif..#ifdef F
2a030 44 5f 43 4c 4f 45 58 45 43 0a 20 20 6f 73 46 63  D_CLOEXEC.  osFc
2a040 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
2a050 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
2a060 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
2a070 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 0a  OEXEC);.#endif..
2a080 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
2a090 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2a0a0 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64  IN_DB;..  .#if d
2a0b0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a0c0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2a0d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a0e0 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
2a0f0 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
2a100 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  1 ){.    ((unixF
2a110 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73  ile*)pFile)->las
2a120 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
2a130 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2a140 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
2a150 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2a160 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
2a170 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
2a180 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
2a190 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
2a1a0 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
2a1b0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2a1c0 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
2a1d0 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2a1e0 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
2a1f0 6e 64 69 66 0a 20 20 0a 23 69 66 20 53 51 4c 49  ndif.  .#if SQLI
2a200 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2a210 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
2a220 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2a230 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
2a240 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
2a250 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
2a260 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
2a270 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
2a280 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
2a290 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
2a2a0 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
2a2b0 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
2a2c0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
2a2d0 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
2a2e0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
2a2f0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2a300 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
2a310 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
2a320 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
2a330 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
2a340 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
2a350 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
2a360 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
2a370 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
2a380 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
2a390 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
2a3a0 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
2a3b0 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
2a3c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
2a3d0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2a3e0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2a3f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65         /* In the
2a400 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66  ory, the close(f
2a410 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f  d) call is sub-o
2a420 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66  ptimal. If the f
2a430 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20  ile opened.     
2a440 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73     ** with fd is
2a450 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
2a460 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2a470 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2a480 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
2a490 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  * on that file t
2a4a0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
2a4b0 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f  y holding adviso
2a4c0 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a  ry locks on it,.
2a4d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2a4e0 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73  the call to clos
2a4f0 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  e() will cancel 
2a500 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20  those locks. In 
2a510 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20  practice,.      
2a520 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d    ** we're assum
2a530 69 6e 67 20 74 68 61 74 20 73 74 61 74 66 73 28  ing that statfs(
2a540 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76  ) doesn't fail v
2a550 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65  ery often. At le
2a560 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ast.        ** n
2a570 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66  ot while other f
2a580 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2a590 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
2a5a0 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20  me process on.  
2a5b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
2a5c0 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69  e file are worki
2a5d0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng.  */.        
2a5e0 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  p->lastErrno = e
2a5f0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f  rrno;.        ro
2a600 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2a610 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2a620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a630 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
2a640 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e         goto open
2a650 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20  _finished;.     
2a660 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78   }.      useProx
2a670 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
2a680 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
2a690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
2a6a0 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
2a6b0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
2a6c0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 73  File(pVfs, fd, s
2a6d0 79 6e 63 44 69 72 2c 20 70 46 69 6c 65 2c 20 7a  yncDir, pFile, z
2a6e0 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 0a 20 20  Path, noLock,.  
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a700 20 20 20 20 20 20 20 20 69 73 44 65 6c 65 74 65          isDelete
2a710 2c 20 69 73 52 65 61 64 6f 6e 6c 79 29 3b 0a 20  , isReadonly);. 
2a720 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a740 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e    rc = proxyTran
2a750 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75  sformUnixFile((u
2a760 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20  nixFile*)pFile, 
2a770 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20  ":auto:");.     
2a780 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a7a0 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f    /* Use unixClo
2a7b0 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  se to clean up t
2a7c0 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64 64  he resources add
2a7d0 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78  ed in fillInUnix
2a7e0 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20  File .          
2a7f0 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c  ** and clear all
2a800 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73   the structure's
2a810 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70   references.  Sp
2a820 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20  ecifically, .   
2a830 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d         ** pFile-
2a840 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62  >pMethods will b
2a850 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65  e NULL so sqlite
2a860 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65  3OsClose will be
2a870 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20   a no-op .      
2a880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a890 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65   unixClose(pFile
2a8a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
2a8b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2a8c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a8d0 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2a8e0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ed;.    }.  }.#e
2a8f0 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66  ndif.  .  rc = f
2a900 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
2a910 66 73 2c 20 66 64 2c 20 73 79 6e 63 44 69 72 2c  fs, fd, syncDir,
2a920 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
2a930 6f 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  oLock,.         
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 44               isD
2a950 65 6c 65 74 65 2c 20 69 73 52 65 61 64 6f 6e 6c  elete, isReadonl
2a960 79 29 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  y);.open_finishe
2a970 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
2a980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2a990 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
2a9a0 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
2a9b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2a9c0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
2a9d0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
2a9e0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
2a9f0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
2aa00 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
2aa10 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
2aa20 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
2aa30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2aa40 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
2aa50 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2aa60 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
2aa70 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
2aa80 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
2aa90 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2aaa0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2aab0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2aac0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
2aad0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aaf0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
2ab00 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
2ab10 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
2ab20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2ab30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
2ab40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ab50 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
2ab60 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
2ab70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ab80 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
2ab90 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
2aba0 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 21 3d 45  (-1) && errno!=E
2abb0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 65 74  NOENT ){.    ret
2abc0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
2abd0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
2abe0 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
2abf0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 69 66 6e  zPath);.  }.#ifn
2ac00 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
2ac10 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
2ac20 20 64 69 72 53 79 6e 63 20 29 7b 0a 20 20 20 20   dirSync ){.    
2ac30 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d  int fd;.    rc =
2ac40 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
2ac50 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20  (zPath, &fd);.  
2ac60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ac70 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  _OK ){.#if OS_VX
2ac80 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20  WORKS.      if( 
2ac90 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a  fsync(fd)==-1 ).
2aca0 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
2acb0 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64  fsync(fd) ).#end
2acc0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2acd0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2ace0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
2acf0 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73  R_DIR_FSYNC, "fs
2ad00 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ync", zPath);.  
2ad10 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75      }.      robu
2ad20 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
2ad30 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
2ad40 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2ad50 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2ad60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ad70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2ad80 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2ad90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
2ada0 74 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  t the existance 
2adb0 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
2adc0 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
2add0 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
2ade0 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
2adf0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
2ae00 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
2ae10 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
2ae20 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
2ae30 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
2ae40 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
2ae50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
2ae60 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
2ae70 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
2ae80 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
2ae90 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
2aea0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
2aeb0 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
2aec0 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
2aed0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
2aee0 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
2aef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2af00 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
2af10 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2af20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
2af30 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
2af40 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
2af50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2af60 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
2af70 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
2af80 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
2af90 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2afa0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
2afb0 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
2afc0 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
2afd0 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
2afe0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
2aff0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
2b000 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
2b010 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2b020 6f 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  ode = 0;.  UNUSE
2b030 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2b040 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
2b050 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2b060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
2b070 45 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68  ESS; );.  switch
2b080 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
2b090 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2b0a0 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
2b0b0 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20  amode = F_OK;.  
2b0c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2b0d0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2b0e0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
2b0f0 20 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c     amode = W_OK|
2b100 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  R_OK;.      brea
2b110 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
2b120 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
2b130 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f        amode = R_
2b140 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2b150 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
2b160 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
2b170 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
2b180 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
2b190 52 65 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65  ResOut = (osAcce
2b1a0 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29  ss(zPath, amode)
2b1b0 3d 3d 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ==0);.  if( flag
2b1c0 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
2b1d0 5f 45 58 49 53 54 53 20 26 26 20 2a 70 52 65 73  _EXISTS && *pRes
2b1e0 4f 75 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  Out ){.    struc
2b1f0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
2b200 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
2b210 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
2b220 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a  f.st_size==0 ){.
2b230 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
2b240 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2b250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b260 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  ;.}.../*.** Turn
2b270 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2b280 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
2b290 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72   pathname. The r
2b2a0 65 6c 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20  elative path.** 
2b2b0 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e  is stored as a n
2b2c0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
2b2d0 72 69 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66  ring in the buff
2b2e0 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
2b2f0 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a  .** zPath. .**.*
2b300 2a 20 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f  * zOut points to
2b310 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
2b320 6c 65 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66  least sqlite3_vf
2b330 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  s.mxPathname byt
2b340 65 73 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20  es .** (in this 
2b350 63 61 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41  case, MAX_PATHNA
2b360 4d 45 20 62 79 74 65 73 29 2e 20 54 68 65 20 66  ME bytes). The f
2b370 75 6c 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74  ull-path is writ
2b380 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62  ten to.** this b
2b390 75 66 66 65 72 20 62 65 66 6f 72 65 20 72 65 74  uffer before ret
2b3a0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
2b3b0 63 20 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61  c int unixFullPa
2b3c0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
2b3d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2b3e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b3f0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2b400 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2b410 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
2b420 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
2b430 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
2b440 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75  ath */.  int nOu
2b450 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2b460 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b470 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
2b480 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
2b490 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b4b0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
2b4c0 29 7b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ){..  /* It's od
2b4d0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2b4e0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2b4f0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2b500 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2b510 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2b520 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2b530 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2b540 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2b550 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2b560 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
2b570 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
2b580 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
2b590 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
2b5a0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
2b5b0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
2b5c0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
2b5d0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2b5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2b5f0 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  OR );..  assert(
2b600 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2b610 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e==MAX_PATHNAME 
2b620 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2b630 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
2b640 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27  zOut[nOut-1] = '
2b650 5c 30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  \0';.  if( zPath
2b660 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
2b670 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b680 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
2b690 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  ", zPath);.  }el
2b6a0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64  se{.    int nCwd
2b6b0 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  ;.    if( osGetc
2b6c0 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29  wd(zOut, nOut-1)
2b6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2b6e0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
2b6f0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2b700 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
2b710 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
2b720 20 20 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73     nCwd = (int)s
2b730 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20  trlen(zOut);.   
2b740 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2b750 66 28 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f  f(nOut-nCwd, &zO
2b760 75 74 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c  ut[nCwd], "/%s",
2b770 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72   zPath);.  }.  r
2b780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b790 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2b7a0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2b7b0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
2b7c0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
2b7d0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
2b7e0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
2b7f0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
2b800 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
2b810 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
2b820 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
2b830 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
2b840 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a  clude <dlfcn.h>.
2b850 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69  static void *uni
2b860 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  xDlOpen(sqlite3_
2b870 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f  vfs *NotUsed, co
2b880 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2b890 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ame){.  UNUSED_P
2b8a0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2b8b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70  );.  return dlop
2b8c0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54  en(zFilename, RT
2b8d0 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c  LD_NOW | RTLD_GL
2b8e0 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OBAL);.}../*.** 
2b8f0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2b900 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64  s function immed
2b910 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63  iately after a c
2b920 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d  all to unixDlSym
2b930 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f  () or.** unixDlO
2b940 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74  pen() fails (ret
2b950 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  urns a null poin
2b960 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20  ter). If a more 
2b970 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a  detailed error.*
2b980 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61  * message is ava
2b990 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72  ilable, it is wr
2b9a0 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74  itten to zBufOut
2b9b0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65  . If no error me
2b9c0 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69  ssage.** is avai
2b9d0 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69  lable, zBufOut i
2b9e0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
2b9f0 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65  d and SQLite use
2ba00 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65  s a default.** e
2ba10 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
2ba20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
2ba30 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  xDlError(sqlite3
2ba40 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
2ba50 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2ba60 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74  BufOut){.  const
2ba70 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
2ba80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ba90 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78  NotUsed);.  unix
2baa0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2bab0 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29  zErr = dlerror()
2bac0 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
2bad0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2bae0 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f  intf(nBuf, zBufO
2baf0 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  ut, "%s", zErr);
2bb00 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
2bb10 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69  Mutex();.}.stati
2bb20 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53  c void (*unixDlS
2bb30 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2bb40 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
2bb50 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
2bb60 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  m))(void){.  /* 
2bb70 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d  .  ** GCC with -
2bb80 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20  pedantic-errors 
2bb90 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f  says that C90 do
2bba0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76  es not allow a v
2bbb0 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20  oid* to be.  ** 
2bbc0 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e  cast into a poin
2bbd0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2bbe0 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20  n.  And yet the 
2bbf0 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20  library dlsym() 
2bc00 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74  routine.  ** ret
2bc10 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69  urns a void* whi
2bc20 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  ch is really a p
2bc30 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
2bc40 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f  tion.  So how do
2bc50 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73   we.  ** use dls
2bc60 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e  ym() with -pedan
2bc70 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a  tic-errors?.  **
2bc80 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78  .  ** Variable x
2bc90 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65   below is define
2bca0 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65  d to be a pointe
2bcb0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
2bcc0 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61  taking.  ** para
2bcd0 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64  meters void* and
2bce0 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64   const char* and
2bcf0 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69   returning a poi
2bd00 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
2bd10 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74  on..  ** We init
2bd20 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69  ialize x by assi
2bd30 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74  gning it a point
2bd40 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28  er to the dlsym(
2bd50 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ) function..  **
2bd60 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e   (That assignmen
2bd70 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73  t requires a cas
2bd80 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c  t.)  Then we cal
2bd90 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  l the function t
2bda0 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74  hat.  ** x point
2bdb0 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  s to.  .  **.  *
2bdc0 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75  * This work-arou
2bdd0 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74  nd is unlikely t
2bde0 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  o work correctly
2bdf0 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77   on any system w
2be00 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65  here.  ** you re
2be10 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74  ally cannot cast
2be20 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
2be30 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20  ter into void*. 
2be40 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68   But then, on th
2be50 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e  e.  ** other han
2be60 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20  d, dlsym() will 
2be70 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68  not work on such
2be80 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72   a system either
2be90 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a  , so we have.  *
2bea0 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73  * not really los
2beb0 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  t anything..  */
2bec0 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76  .  void (*(*x)(v
2bed0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
2bee0 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53  ))(void);.  UNUS
2bef0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2bf00 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f  Used);.  x = (vo
2bf10 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f  id(*(*)(void*,co
2bf20 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
2bf30 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72  ))dlsym;.  retur
2bf40 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b  n (*x)(p, zSym);
2bf50 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
2bf60 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  nixDlClose(sqlit
2bf70 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2bf80 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
2bf90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2bfa0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2bfb0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
2bfc0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
2bfd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2bfe0 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
2bff0 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
2c000 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20  ine unixDlOpen  
2c010 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2c020 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66  DlError 0.  #def
2c030 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20  ine unixDlSym   
2c040 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
2c050 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2c060 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42  ../*.** Write nB
2c070 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
2c080 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73  om data to the s
2c090 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a  upplied buffer z
2c0a0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2c0b0 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73  nt unixRandomnes
2c0c0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  s(sqlite3_vfs *N
2c0d0 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
2c0e0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2c0f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c100 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73  R(NotUsed);.  as
2c110 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75  sert((size_t)nBu
2c120 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f  f>=(sizeof(time_
2c130 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29  t)+sizeof(int)))
2c140 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ;..  /* We have 
2c150 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
2c160 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
2c170 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
2c180 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
2c190 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
2c1a0 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
2c1b0 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
2c1c0 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
2c1d0 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
2c1e0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
2c1f0 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
2c200 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
2c210 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
2c220 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
2c230 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
2c240 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
2c250 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
2c260 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
2c270 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
2c280 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
2c290 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
2c2a0 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
2c2b0 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
2c2c0 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
2c2d0 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
2c2e0 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
2c2f0 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
2c300 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2c310 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
2c320 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
2c330 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
2c340 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
2c350 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
2c360 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
2c370 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
2c380 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d  equence.  This m
2c390 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
2c3a0 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
2c3b0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
2c3c0 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2c3d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2c3e0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
2c3f0 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
2c400 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2c410 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
2c420 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
2c430 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
2c440 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
2c450 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
2c460 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
2c470 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
2c480 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
2c490 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
2c4a0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
2c4b0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
2c4c0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
2c4d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2c4e0 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
2c4f0 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
2c500 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
2c510 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
2c520 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
2c530 7b 0a 20 20 20 20 20 20 64 6f 7b 20 6e 42 75 66  {.      do{ nBuf
2c540 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42   = osRead(fd, zB
2c550 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c  uf, nBuf); }whil
2c560 65 28 20 6e 42 75 66 3c 30 20 26 26 20 65 72 72  e( nBuf<0 && err
2c570 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
2c580 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2c590 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2c5a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c5b0 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
2c5c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2c5d0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2c5e0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2c5f0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2c600 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
2c610 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
2c620 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2c630 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
2c640 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
2c650 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2c660 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2c670 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
2c680 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
2c690 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2c6a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
2c6b0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
2c6c0 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
2c6d0 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
2c6e0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2c6f0 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
2c700 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
2c710 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
2c720 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2c730 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
2c740 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2c750 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
2c760 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
2c770 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2c780 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
2c790 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
2c7a0 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
2c7b0 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
2c7c0 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
2c7d0 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
2c7e0 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
2c7f0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
2c800 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2c810 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2c820 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2c830 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
2c840 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
2c850 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
2c860 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
2c870 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c880 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2c890 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2c8a0 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
2c8b0 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
2c8c0 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
2c8d0 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
2c8e0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2c8f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2c900 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2c910 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
2c920 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2c930 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2c940 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2c950 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2c960 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2c970 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2c980 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2c990 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2c9a0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2c9b0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2c9c0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2c9d0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2c9e0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2c9f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2ca00 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2ca10 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2ca20 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2ca30 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2ca40 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2ca50 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2ca60 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2ca70 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2ca80 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2ca90 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2caa0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2cab0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2cac0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2cad0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2cae0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2caf0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2cb00 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2cb10 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2cb20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2cb30 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2cb40 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2cb50 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2cb60 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2cb70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2cb80 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2cb90 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2cba0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2cbb0 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
2cbc0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2cbd0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2cbe0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2cbf0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2cc00 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2cc10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
2cc20 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
2cc30 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2cc40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2cc50 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
2cc60 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
2cc70 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2cc80 36 34 30 30 30 30 3b 0a 23 69 66 20 64 65 66 69  640000;.#if defi
2cc90 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
2cca0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
2ccb0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
2ccc0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
2ccd0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
2cce0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
2ccf0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2cd00 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
2cd10 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
2cd20 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
2cd30 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
2cd40 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
2cd50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2cd60 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
2cd70 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
2cd80 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
2cd90 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
2cda0 6f 77 3b 0a 20 20 67 65 74 74 69 6d 65 6f 66 64  ow;.  gettimeofd
2cdb0 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 0a 20 20  ay(&sNow, 0);.  
2cdc0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
2cdd0 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
2cde0 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
2cdf0 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
2ce00 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
2ce10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2ce20 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2ce30 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2ce40 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2ce50 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2ce60 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2ce70 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2ce80 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2ce90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2cea0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2ceb0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2cec0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2ced0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2cee0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2cef0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2cf00 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
2cf10 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2cf20 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2cf30 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
2cf40 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
2cf50 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2cf60 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2cf70 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2cf80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cf90 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
2cfa0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2cfb0 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
2cfc0 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
2cfd0 69 6e 74 36 34 20 69 3b 0a 20 20 55 4e 55 53 45  int64 i;.  UNUSE
2cfe0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2cff0 73 65 64 29 3b 0a 20 20 75 6e 69 78 43 75 72 72  sed);.  unixCurr
2d000 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
2d010 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
2d020 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2d030 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2d040 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20  ** We added the 
2d050 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
2d060 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20  method with the 
2d070 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f  intention of pro
2d080 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72  viding.** better
2d090 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
2d0a0 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f   messages when o
2d0b0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
2d0c0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
2d0d0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
2d0e0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  e operation.  Bu
2d0f0 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f  t so far, none o
2d100 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  f that has been 
2d110 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69  implemented.** i
2d120 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20  n the core.  So 
2d130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2d140 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46  never called.  F
2d150 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65  or now, it is me
2d160 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d  rely.** a place-
2d170 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  holder..*/.stati
2d180 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
2d190 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2d1a0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
2d1b0 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
2d1c0 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
2d1d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2d1e0 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
2d1f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2d200 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
2d210 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2d220 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  d3);.  return 0;
2d230 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
2d240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d250 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
2d260 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
2d270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d280 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2d290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
2d2e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d2f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d320 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2d330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d340 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
2d350 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
2d360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d370 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
2d380 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
2d390 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
2d3a0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
2d3b0 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
2d3c0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
2d3d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
2d3e0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
2d3f0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
2d400 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
2d410 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
2d420 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
2d430 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
2d440 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
2d450 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
2d460 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
2d470 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
2d480 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
2d490 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
2d4a0 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
2d4b0 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
2d4c0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
2d4d0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
2d4e0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
2d4f0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
2d500 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
2d510 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
2d520 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
2d530 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
2d540 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
2d550 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
2d560 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
2d570 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
2d580 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
2d590 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
2d5a0 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
2d5b0 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
2d5c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2d5d0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
2d5e0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
2d5f0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
2d600 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
2d610 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
2d620 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
2d630 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
2d640 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
2d650 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
2d660 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
2d670 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
2d680 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
2d690 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
2d6a0 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
2d6b0 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
2d6c0 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
2d6d0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
2d6e0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
2d6f0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
2d700 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
2d710 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
2d720 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
2d730 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
2d740 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
2d750 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
2d760 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
2d770 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
2d780 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
2d790 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
2d7a0 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
2d7b0 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
2d7c0 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
2d7d0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
2d7e0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2d7f0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2d800 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
2d810 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
2d820 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
2d830 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
2d840 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
2d850 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
2d860 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20 20 20  000..   ..**    
2d870 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
2d880 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
2d890 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
2d8a0 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
2d8b0 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
2d8c0 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
2d8d0 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
2d8e0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2d8f0 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
2d900 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
2d910 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
2d920 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
2d930 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
2d940 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
2d950 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
2d960 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
2d970 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
2d980 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
2d990 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
2d9a0 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
2d9b0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2d9c0 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
2d9d0 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
2d9e0 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
2d9f0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
2da00 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
2da10 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
2da20 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
2da30 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
2da40 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
2da50 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
2da60 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
2da70 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
2da80 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
2da90 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
2daa0 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
2dab0 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
2dac0 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
2dad0 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
2dae0 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
2daf0 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
2db00 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
2db10 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
2db20 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
2db30 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
2db40 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
2db50 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
2db60 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
2db70 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
2db80 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
2db90 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
2dba0 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
2dbb0 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
2dbc0 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
2dbd0 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
2dbe0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
2dbf0 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
2dc00 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
2dc10 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
2dc20 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
2dc30 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
2dc40 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
2dc50 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
2dc60 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
2dc70 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
2dc80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
2dc90 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
2dca0 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
2dcb0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
2dcc0 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  me, SQLITE_SET_L
2dcd0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcf0 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
2dd00 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
2dd10 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2dd20 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2dd30 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47 45 54  name, SQLITE_GET
2dd40 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
2dd50 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a  &<proxy_path>);.
2dd60 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61  **.**.** SQL pra
2dd70 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47  gmas.**.**  PRAG
2dd80 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
2dd90 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70  ck_proxy_file=<p
2dda0 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75  roxy_path> | :au
2ddb0 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  to:.**  PRAGMA [
2ddc0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
2ddd0 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  roxy_file.**.** 
2dde0 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74  Specifying ":aut
2ddf0 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69  o:" means that i
2de00 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
2de10 63 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d  ch file with a m
2de20 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20  atching.** host 
2de30 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72  ID in it, the pr
2de40 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20  oxy path in the 
2de50 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2de60 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69  be used, otherwi
2de70 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61  se.** a proxy pa
2de80 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  th based on the 
2de90 75 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a  user's temp dir.
2dea0 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28  ** (via confstr(
2deb0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
2dec0 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77  TEMP_DIR,...)) w
2ded0 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20  ill be used and 
2dee0 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72  the.** actual pr
2def0 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  oxy file name is
2df00 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
2df10 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74  the name and pat
2df20 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  h of the.** data
2df30 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20  base file.  For 
2df40 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2df50 20 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73       For databas
2df60 65 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d  e path "/Users/m
2df70 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20  e/foo.db" .**   
2df80 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74      The lock pat
2df90 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64  h will be "<tmpd
2dfa0 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73  ir>/sqliteplocks
2dfb0 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64  /_Users_me_foo.d
2dfc0 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20  b:auto:").**.** 
2dfd0 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78  Once a lock prox
2dfe0 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  y is configured 
2dff0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
2e000 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61  onnection, it ca
2e010 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f  n not.** be remo
2e020 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ved, however it 
2e030 6d 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20  may be switched 
2e040 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2e050 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a  roxy path via.**
2e060 20 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20   the above APIs 
2e070 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f  (assuming the co
2e080 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nch file is not 
2e090 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e  being held by an
2e0a0 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74  other.** connect
2e0b0 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e  ion or process).
2e0c0 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70   .**.**.** How p
2e0d0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  roxy locking wor
2e0e0 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2e0f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2e100 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c  .** Proxy file l
2e110 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72  ocking relies pr
2e120 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e  imarily on two n
2e130 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69  ew supporting fi
2e140 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  les: .**.**   * 
2e150 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c   conch file to l
2e160 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74  imit access to t
2e170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e180 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73   to a single hos
2e190 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74  t.**      at a t
2e1a0 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70  ime.**.**   *  p
2e1b0 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74  roxy file to act
2e1c0 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20   as a proxy for 
2e1d0 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  the advisory loc
2e1e0 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20  ks normally.**  
2e1f0 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65      taken on the
2e200 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
2e210 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d  The conch file -
2e220 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20   to use a proxy 
2e230 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73  file, sqlite mus
2e240 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68  t first "hold th
2e250 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74  e conch".** by t
2e260 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d  aking an sqlite-
2e270 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63  style shared loc
2e280 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
2e290 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65  ile, reading the
2e2a0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  .** contents and
2e2b0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68   comparing the h
2e2c0 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73  ost's unique hos
2e2d0 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29  t ID (see below)
2e2e0 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f   and lock.** pro
2e2f0 78 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20  xy path against 
2e300 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
2e310 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20  d in the conch. 
2e320 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
2e330 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  is.** stored in 
2e340 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
2e350 72 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ry as the databa
2e360 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
2e370 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20  file name.** is 
2e380 70 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20  patterned after 
2e390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e3a0 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74  e name as ".<dat
2e3b0 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68  abasename>-conch
2e3c0 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  "..** If the con
2e3d0 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  ch file does not
2e3e0 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27 73 20   exist, or it's 
2e3f0 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
2e400 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73  match the.** hos
2e410 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78  t ID and/or prox
2e420 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65  y path, then the
2e430 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74   lock is escalat
2e440 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69  ed to an exclusi
2e450 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74  ve.** lock and t
2e460 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
2e470 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74 65  ntents is update
2e480 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74 20  d with the host 
2e490 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20  ID and proxy.** 
2e4a0 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63  path and the loc
2e4b0 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20  k is downgraded 
2e4c0 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  to a shared lock
2e4d0 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20   again.  If the 
2e4e0 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64  conch.** is held
2e4f0 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   by another proc
2e500 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61 72  ess (with a shar
2e510 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78  ed lock), the ex
2e520 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
2e530 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51  will fail and SQ
2e540 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2e550 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
2e560 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20   proxy file - a 
2e570 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65  single-byte file
2e580 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64   used for all ad
2e590 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b  visory file lock
2e5a0 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61  s.** normally ta
2e5b0 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ken on the datab
2e5c0 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73  ase file.   This
2e5d0 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65   allows for safe
2e5e0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74   sharing.** of t
2e5f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e600 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65   for multiple re
2e610 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72  aders and writer
2e620 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
2e630 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68   host (the conch
2e640 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
2e650 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73  ey all use the s
2e660 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  ame local lock f
2e670 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75  ile)..**.** Requ
2e680 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  esting the lock 
2e690 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69  proxy does not i
2e6a0 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20  mmediately take 
2e6b0 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73  the conch, it is
2e6c0 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77  .** only taken w
2e6d0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72 65  hen the first re
2e6e0 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61  quest to lock da
2e6f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
2e700 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d  ade.  .** This m
2e710 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e  atches the seman
2e720 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61 64  tics of the trad
2e730 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  itional locking 
2e740 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a  behavior, where.
2e750 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e  ** opening a con
2e760 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
2e770 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20  abase file does 
2e780 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20  not take a lock 
2e790 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68  on it..** The sh
2e7a0 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e  ared lock and an
2e7b0 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   open file descr
2e7c0 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61  iptor are mainta
2e7d0 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74  ined until .** t
2e7e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
2e7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2e800 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   closed. .**.** 
2e810 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61  The proxy file a
2e820 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  nd the lock file
2e830 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74   are never delet
2e840 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20  ed so they only 
2e850 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72  need.** to be cr
2e860 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74 20  eated the first 
2e870 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75 73  time they are us
2e880 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67  ed..**.** Config
2e890 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a  uration options.
2e8a0 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
2e8b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20  --------.**.**  
2e8c0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2e8d0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a  OXY_LOCKING.**.*
2e8e0 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65  *       Database
2e8f0 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64 20   files accessed 
2e900 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  on non-local fil
2e910 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a  e systems are.**
2e920 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63         automatic
2e930 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20  ally configured 
2e940 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
2e950 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72  g, lock files ar
2e960 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64  e.**       named
2e970 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
2e980 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f  sing the same lo
2e990 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20  gic as.**       
2e9a0 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78  PRAGMA lock_prox
2e9b0 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a  y_file=":auto:".
2e9c0 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54  **    .**  SQLIT
2e9d0 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a  E_PROXY_DEBUG.**
2e9e0 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65  .**       Enable
2e9f0 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66  s the logging of
2ea00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2ea10 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66  during host id f
2ea20 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ile.**       ret
2ea30 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74  rieval and creat
2ea40 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50  ion.**.**  LOCKP
2ea50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20  ROXYDIR.**.**   
2ea60 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74 68      Overrides th
2ea70 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
2ea80 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2ea90 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68  k proxy files th
2eaa0 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20  at.**       are 
2eab0 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
2eac0 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61 75  lly via the ":au
2ead0 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a  to:" setting.**.
2eae0 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55  **  SQLITE_DEFAU
2eaf0 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
2eb00 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20  ISSIONS.**.**   
2eb10 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20      Permissions 
2eb20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61  to use when crea
2eb30 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
2eb40 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65   for storing the
2eb50 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70  .**       lock p
2eb60 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79  roxy files, only
2eb70 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50   used when LOCKP
2eb80 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73  ROXYDIR is not s
2eb90 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20  et..**    .**   
2eba0 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65   .** As mentione
2ebb0 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f  d above, when co
2ebc0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
2ebd0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2ebe0 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74  LOCKING,.** sett
2ebf0 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d  ing the environm
2ec00 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c  ent variable SQL
2ec10 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
2ec20 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c  LOCKING to 1 wil
2ec30 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79  l.** force proxy
2ec40 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75   locking to be u
2ec50 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64 61  sed for every da
2ec60 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
2ec70 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c  ed, and 0.** wil
2ec80 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69  l force automati
2ec90 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  c proxy locking 
2eca0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20 66  to be disabled f
2ecb0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2ecc0 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63  ** files (explic
2ecd0 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ity calling the 
2ece0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
2ecf0 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d 61 20  ROXYFILE pragma 
2ed00 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c  or.** sqlite_fil
2ed10 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73  e_control API is
2ed20 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20 62 79   not affected by
2ed30 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
2ed40 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f  OXY_LOCKING)..*/
2ed50 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  ../*.** Proxy lo
2ed60 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
2ed70 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53  ailable on MacOS
2ed80 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  X .*/.#if define
2ed90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2eda0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2edb0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
2edc0 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b  ** The proxyLock
2edd0 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73 20 74  ingContext has t
2ede0 68 65 20 70 61 74 68 20 61 6e 64 20 66 69 6c 65  he path and file
2edf0 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
2ee00 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61  the remote .** a
2ee10 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66  nd local proxy f
2ee20 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79  iles in it.*/.ty
2ee30 70 65 64 65 66 20 73 74 72 75 63 74 20 70 72 6f  pedef struct pro
2ee40 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2ee50 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2ee60 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70 72 6f  text;.struct pro
2ee70 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2ee80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63   {.  unixFile *c
2ee90 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20  onchFile;       
2eea0 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20    /* Open conch 
2eeb0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2eec0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 20 20  conchFilePath;  
2eed0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2eee0 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2eef0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
2ef00 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20 20 20  lockProxy;      
2ef10 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79     /* Open proxy
2ef20 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
2ef30 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50  char *lockProxyP
2ef40 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ath;         /* 
2ef50 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 78  Name of the prox
2ef60 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20  y lock file */. 
2ef70 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20   char *dbPath;  
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ef90 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
2efa0 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  n file */.  int 
2efb0 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20 20 20  conchHeld;      
2efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 69 66           /* 1 if
2efd0 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 68 65   the conch is he
2efe0 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65  ld, -1 if lockle
2eff0 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  ss */.  void *ol
2f000 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
2f010 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2f020 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
2f030 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
2f040 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
2f050 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
2f060 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
2f070 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
2f080 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
2f090 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
2f0a0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
2f0b0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
2f0c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
2f0d0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
2f0e0 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
2f0f0 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
2f100 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
2f110 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
2f120 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
2f130 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
2f140 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
2f150 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2f160 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
2f170 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
2f180 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
2f190 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
2f1a0 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
2f1b0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
2f1c0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
2f1d0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
2f1e0 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
2f1f0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
2f200 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
2f210 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2f220 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
2f230 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
2f240 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
2f250 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
2f260 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
2f270 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
2f280 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
2f290 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
2f2a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2f2b0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
2f2c0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20   getpid()));.   
2f2d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f2e0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
2f2f0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
2f300 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
2f310 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
2f320 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
2f330 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
2f340 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
2f350 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
2f360 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
2f370 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
2f380 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
2f390 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
2f3a0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
2f3b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
2f3c0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
2f3d0 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
2f3e0 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
2f3f0 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2f400 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
2f410 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
2f420 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
2f430 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
2f440 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
2f450 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
2f460 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
2f470 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
2f480 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
2f490 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
2f4a0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
2f4b0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
2f4c0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
2f4d0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
2f4e0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
2f4f0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
2f500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f510 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
2f520 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
2f530 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
2f540 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
2f550 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
2f560 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2f570 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
2f580 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
2f590 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
2f5a0 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
2f5b0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
2f5c0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
2f5d0 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
2f5e0 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
2f5f0 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
2f600 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
2f610 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
2f620 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
2f630 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
2f640 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
2f650 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
2f660 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
2f670 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
2f680 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
2f690 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
2f6a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
2f6b0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
2f6c0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
2f6d0 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
2f6e0 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
2f6f0 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
2f700 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2f710 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
2f720 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
2f730 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
2f740 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
2f750 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
2f760 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
2f770 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
2f780 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
2f790 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66 2c 20   if( mkdir(buf, 
2f7a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2f7b0 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
2f7c0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
2f7d0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
2f7e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2f7f0 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
2f800 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
2f810 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
2f820 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
2f830 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f850 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
2f860 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
2f870 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2f880 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
2f890 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
2f8a0 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  kPath, getpid())
2f8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2f8c0 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20  eturn err;.     
2f8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f8f0 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a  tart=i+1;.    }.
2f900 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63      buf[i] = loc
2f910 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20  kPath[i];.  }.  
2f920 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
2f930 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
2f940 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
2f950 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68  =%d\n", lockPath
2f960 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
2f970 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2f980 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2f990 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
2f9a0 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
2f9b0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2f9c0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
2f9d0 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
2f9e0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
2f9f0 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
2fa00 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
2fa10 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2fa20 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
2fa30 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
2fa40 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
2fa50 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
2fa60 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
2fa70 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
2fa80 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
2fa90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2faa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2fab0 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2fac0 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
2fad0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
2fae0 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
2faf0 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
2fb00 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
2fb10 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
2fb20 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
2fb30 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
2fb40 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
2fb50 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
2fb60 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
2fb70 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
2fb80 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2fb90 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
2fba0 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65  = -1;.  unixFile
2fbb0 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63   *pNew;.  int rc
2fbc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2fbd0 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
2fbe0 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
2fbf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
2fc00 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20  dummyVfs;.  int 
2fc10 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e  terrno = 0;.  Un
2fc20 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2fc30 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  sed = NULL;..  /
2fc40 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79 20 74  * 1. first try t
2fc50 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
2fc60 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69  e file.  ** 2. i
2fc70 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e  f that fails, an
2fc80 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b  d this is a lock
2fc90 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68   file (not-conch
2fca0 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a  ), try creating.
2fcb0 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20    ** the parent 
2fcc0 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20  directories and 
2fcd0 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a  then try again..
2fce0 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20    ** 3. if that 
2fcf0 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70  fails, try to op
2fd00 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65 61 64  en the file read
2fd10 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72  -only.  ** other
2fd20 77 69 73 65 20 72 65 74 75 72 6e 20 42 55 53 59  wise return BUSY
2fd30 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20   (if lock file) 
2fd40 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20  or CANTOPEN for 
2fd50 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  the conch file. 
2fd60 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20   */.  pUnused = 
2fd70 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70  findReusableFd(p
2fd80 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b  ath, openFlags);
2fd90 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29  .  if( pUnused )
2fda0 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73  {.    fd = pUnus
2fdb0 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b  ed->fd;.  }else{
2fdc0 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73  .    pUnused = s
2fdd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2fde0 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
2fdf0 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
2fe00 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
2fe10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2fe20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2fe30 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
2fe40 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
2fe50 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2fe60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2fe70 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2fe80 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
2fe90 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
2fea0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
2feb0 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
2fec0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
2fed0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
2fee0 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
2fef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
2ff00 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
2ff10 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
2ff20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2ff30 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
2ff40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ff50 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2ff60 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  ){.    openFlags
2ff70 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
2ff80 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
2ff90 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2ffa0 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  s, SQLITE_DEFAUL
2ffb0 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
2ffc0 4e 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20  NS);.    terrno 
2ffd0 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69  = errno;.  }.  i
2ffe0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69  f( fd<0 ){.    i
2fff0 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b  f( islockfile ){
30000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30010 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
30020 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72  .    switch (ter
30030 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73  rno) {.      cas
30040 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20  e EACCES:.      
30050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30060 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65  PERM;.      case
30070 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72   EIO: .        r
30080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30090 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e  RR_LOCK; /* even
300a0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68   though it is th
300b0 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20  e conch */.     
300c0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
300d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
300e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
300f0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e     }.  }.  .  pN
30100 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
30110 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
30120 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
30130 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
30140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
30150 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
30160 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
30170 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
30180 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
30190 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
301a0 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73   pNew->openFlags
301b0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
301c0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73  memset(&dummyVfs
301d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
301e0 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56  yVfs));.  dummyV
301f0 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
30200 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
30210 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56  Finder;.  dummyV
30220 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d  fs.zName = "dumm
30230 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  y";.  pUnused->f
30240 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
30250 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
30260 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
30270 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
30280 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
30290 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
302a0 56 66 73 2c 20 66 64 2c 20 30 2c 20 28 73 71 6c  Vfs, fd, 0, (sql
302b0 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
302c0 20 70 61 74 68 2c 20 30 2c 20 30 2c 20 30 29 3b   path, 0, 0, 0);
302d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
302e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
302f0 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
30300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30310 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
30320 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
30330 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
30340 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
30350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
30360 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
30370 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
30380 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
30390 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
303a0 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
303b0 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
303c0 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
303d0 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
303e0 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
303f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
30400 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
30410 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
30420 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
30430 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
30440 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20  ngth */../* Not 
30450 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69  always defined i
30460 6e 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73  n the headers as
30470 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
30480 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65  */.extern int ge
30490 74 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74  thostuuid(uuid_t
304a0 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63   id, const struc
304b0 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74  t timespec *wait
304c0 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68  );../* get the h
304d0 6f 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f  ost ID via getho
304e0 73 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49  stuuid(), pHostI
304f0 44 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  D must point to 
30500 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
30510 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69  .** bytes of wri
30520 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  table memory..*/
30530 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
30540 79 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67  yGetHostID(unsig
30550 6e 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49  ned char *pHostI
30560 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b  D, int *pError){
30570 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f  .  assert(PROXY_
30580 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a  HOSTIDLEN == siz
30590 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20  eof(uuid_t));.  
305a0 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20  memset(pHostID, 
305b0 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  0, PROXY_HOSTIDL
305c0 45 4e 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  EN);.#if defined
305d0 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56 45 52 53  (__MAX_OS_X_VERS
305e0 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
305f0 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
30600 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53 5f 58 5f    && __MAC_OS_X_
30610 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55  VERSION_MIN_REQU
30620 49 52 45 44 3c 31 30 35 30 0a 20 20 7b 0a 20 20  IRED<1050.  {.  
30630 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
30640 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74  truct timespec t
30650 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b  imeout = {1, 0};
30660 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75   /* 1 sec timeou
30670 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74  t */.    if( get
30680 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
30690 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
306a0 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
306b0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
306c0 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
306d0 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b    *pError = err;
306e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
306f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30700 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
30710 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
30720 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a  AMETER(pError);.
30730 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
30740 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73  LITE_TEST.  /* s
30750 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
30760 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
30770 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
30780 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20   file paths */. 
30790 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73   if( sqlite3_hos
307a0 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20  tid_num != 0){. 
307b0 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20     pHostID[0] = 
307c0 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30  (char)(pHostID[0
307d0 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74  ] + (char)(sqlit
307e0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20  e3_hostid_num & 
307f0 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  0xFF));.  }.#end
30800 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53  if.  .  return S
30810 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
30820 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  The conch file c
30830 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64  ontains the head
30840 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20  er, host id and 
30850 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
30860 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
30870 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20  _CONCHVERSION 2 
30880 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64    /* 1-byte head
30890 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74  er, 16-byte host
308a0 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65   id, path */.#de
308b0 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45  fine PROXY_HEADE
308c0 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63  RLEN    1   /* c
308d0 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72  onch file header
308e0 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69   length */.#defi
308f0 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  ne PROXY_PATHIND
30900 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41  EX    (PROXY_HEA
30910 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
30920 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20  TIDLEN).#define 
30930 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30940 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52  N  (PROXY_HEADER
30950 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
30960 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a  LEN+MAXPATHLEN).
30970 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ./* .** Takes an
30980 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   open conch file
30990 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e  , copies the con
309a0 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70  tents to a new p
309b0 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76  ath and then mov
309c0 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20  es .** it back. 
309d0 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74   The newly creat
309e0 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64  ed file's file d
309f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73  escriptor is ass
30a00 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  igned to the.** 
30a10 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63  conch file struc
30a20 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ture and finally
30a30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
30a40 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  nch file descrip
30a50 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65  tor is .** close
30a60 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f  d.  Returns zero
30a70 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
30a80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30a90 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
30aa0 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
30ab0 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
30ac0 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  ID){.  proxyLock
30ad0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
30ae0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
30af0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
30b00 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
30b10 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
30b20 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
30b30 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61  conchFile;.  cha
30b40 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  r tPath[MAXPATHL
30b50 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  EN];.  char buf[
30b60 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30b70 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74  N];.  char *cPat
30b80 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  h = pCtx->conchF
30b90 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f  ilePath;.  size_
30ba0 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
30bb0 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
30bc0 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d  = 0;.  char errm
30bd0 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69  sg[64] = "";.  i
30be0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
30bf0 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55  t rc = -1;.  UNU
30c00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79  SED_PARAMETER(my
30c10 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63  HostID);..  /* c
30c20 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
30c30 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
30c40 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
30c50 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
30c60 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
30c70 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
30c80 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
30c90 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
30ca0 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
30cb0 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
30cc0 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
30cd0 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
30ce0 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
30cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30d00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
30d10 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61  rmsg),errmsg,"pa
30d20 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  th error (len %d
30d30 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  )",(int)pathLen)
30d40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
30d50 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
30d60 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
30d70 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
30d80 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64  eadLen = osPread
30d90 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62  (conchFile->h, b
30da0 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  uf, PROXY_MAXCON
30db0 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28  CHLEN, 0);.  if(
30dc0 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50   readLen<PROXY_P
30dd0 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  ATHINDEX ){.    
30de0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30df0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
30e00 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72  errmsg,"read err
30e10 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
30e20 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20  t)readLen);.    
30e30 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
30e40 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69  ck;.  }.  /* wri
30e50 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
30e60 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b   temporary break
30e70 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20   file */.  fd = 
30e80 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74  robust_open(tPat
30e90 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  h, (O_RDWR|O_CRE
30ea0 41 54 7c 4f 5f 45 58 43 4c 29 2c 0a 20 20 20 20  AT|O_EXCL),.    
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
30ec0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
30ed0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
30ee0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
30ef0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
30f00 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
30f10 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
30f20 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
30f30 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
30f40 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
30f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
30f60 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
30f70 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
30f80 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
30f90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30fa0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
30fb0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
30fc0 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
30fd0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
30fe0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
30ff0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
31000 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
31010 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
31020 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31030 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
31040 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
31050 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
31060 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
31070 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
31080 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
31090 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
310a0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
310b0 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
310c0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
310d0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
310e0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
310f0 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
31100 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
31110 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
31120 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
31130 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
31140 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
31150 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
31160 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
31170 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
31180 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
31190 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
311a0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
311b0 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
311c0 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
311d0 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
311e0 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
311f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31200 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
31210 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
31220 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
31230 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
31240 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
31250 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
31260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31270 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
31280 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
31290 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
312a0 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
312b0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
312c0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
312d0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
312e0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
312f0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
31300 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
31310 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31320 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
31330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
31340 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
31350 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
31360 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
31370 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f   memset(&conchMo
31380 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  dTime, 0, sizeof
31390 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b  (conchModTime));
313a0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
313b0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
313c0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
313d0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
313e0 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
313f0 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
31400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31410 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
31420 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
31430 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
31440 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
31450 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
31460 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
31470 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
31480 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
31490 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
314a0 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
314b0 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
314c0 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
314d0 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
314e0 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
314f0 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
31500 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
31510 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
31520 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
31530 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
31540 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
31550 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
31560 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
31570 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
31580 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
31590 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
315a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
315b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
315c0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
315d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
315e0 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d      if( nTries==
315f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1 ){.        con
31600 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e  chModTime = buf.
31610 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20  st_mtimespec;.  
31620 20 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30        usleep(500
31630 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e  000); /* wait 0.
31640 35 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68  5 sec and try th
31650 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20  e lock again*/. 
31660 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
31670 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
31680 20 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73    assert( nTries
31690 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >1 );.      if( 
316a0 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
316b0 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74  sec != buf.st_mt
316c0 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c  imespec.tv_sec |
316d0 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63  | .         conc
316e0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63  hModTime.tv_nsec
316f0 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65   != buf.st_mtime
31700 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a  spec.tv_nsec ){.
31710 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31720 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
31730 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
31740 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29   if( nTries==2 )
31750 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72  {  .        char
31760 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43   tBuf[PROXY_MAXC
31770 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
31780 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72    int len = osPr
31790 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
317a0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
317b0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
317c0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
317d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
317e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
317f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
31800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31810 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
31820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
31830 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
31840 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
31850 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
31860 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
31870 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
31880 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
31890 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
318a0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
318b0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
318c0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
318d0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
318e0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
318f0 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
31900 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31910 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
31920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31940 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
31950 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
31960 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
31970 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
31980 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
31990 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
319a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
319b0 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
319c0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
319d0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
319e0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
319f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
31a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
31a10 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
31a20 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
31a30 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
31a40 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
31a50 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
31a60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31a70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
31a80 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
31a90 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
31aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
31ab0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
31ac0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
31ad0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31ae0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
31af0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
31b00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
31b10 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31b20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
31b30 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
31b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
31b50 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
31b60 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
31b70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
31b80 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
31b90 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
31ba0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
31bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
31bc0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
31bd0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
31be0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
31bf0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
31c00 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
31c10 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
31c20 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
31c30 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
31c40 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
31c50 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
31c60 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
31c70 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
31c80 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
31c90 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
31ca0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
31cb0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
31cc0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
31cd0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
31ce0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
31cf0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
31d00 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
31d10 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
31d20 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
31d30 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
31d40 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
31d50 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
31d60 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
31d70 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
31d80 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
31d90 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
31da0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31db0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
31dc0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
31dd0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
31de0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
31df0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
31e00 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
31e10 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
31e20 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
31e30 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
31e40 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
31e50 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
31e60 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
31e70 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
31e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31e90 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
31ea0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
31eb0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
31ec0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
31ed0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
31ee0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
31ef0 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
31f00 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
31f10 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
31f20 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
31f30 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
31f40 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
31f60 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
31f70 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
31f80 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
31f90 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
31fa0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
31fb0 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
31fc0 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
31fd0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
31fe0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
31ff0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
32000 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
32010 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
32020 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
32030 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
32040 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
32050 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
32060 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
32070 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32080 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
32090 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
320a0 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
320b0 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
320c0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
320d0 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
320e0 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
320f0 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
32100 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
32110 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
32120 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
32130 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
32140 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
32150 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
32160 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
32170 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
32180 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
32190 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
321a0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
321b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
321c0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
321d0 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
321e0 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
321f0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
32200 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
32210 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
32220 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
32230 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
32240 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
32250 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
32260 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
32270 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
32280 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
32290 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
322a0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
322b0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
322c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
322d0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
322e0 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
322f0 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
32300 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
32310 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
32320 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
32330 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
32340 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
32350 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
32360 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
32370 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
32380 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
32390 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
323a0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
323b0 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
323c0 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
323d0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
323e0 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
323f0 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
32400 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
32410 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
32420 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
32430 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
32440 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
32450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32470 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
32480 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
32490 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
324a0 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
324b0 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
324c0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
324d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
324e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
324f0 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
32500 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
32510 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
32520 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
32530 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
32540 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
32550 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
32560 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
32570 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
32580 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
32590 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
325a0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
325b0 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
325c0 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
325d0 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
325e0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
325f0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
32600 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
32610 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
32620 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
32630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32640 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32650 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
32660 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
32670 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
32680 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
32690 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
326a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
326b0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
326c0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
326d0 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
326e0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
326f0 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
32700 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
32710 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
32720 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
32730 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32740 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
32750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
32770 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
32780 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
32790 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
327a0 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
327b0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
327c0 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
327d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
327e0 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
327f0 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
32800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
32810 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
32820 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
32830 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
32840 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
32850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32860 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
32870 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
32880 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
32890 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
328a0 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
328b0 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
328c0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
328d0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
328e0 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
328f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
32900 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32910 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
32920 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
32930 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
32940 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
32950 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
32960 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
32970 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
32980 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32990 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
329a0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
329b0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
329c0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
329d0 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
329e0 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
329f0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
32a00 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
32a10 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
32a20 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
32a30 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
32a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
32a50 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
32a60 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
32a70 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
32a80 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
32a90 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
32aa0 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
32ab0 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
32ac0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
32ad0 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
32ae0 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
32af0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32b00 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
32b10 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
32b20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
32b30 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
32b40 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
32b50 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
32b60 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
32b70 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
32b80 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
32b90 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
32ba0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
32bb0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
32bc0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
32bd0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
32be0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
32bf0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
32c00 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
32c10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32c20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
32c30 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
32c40 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
32c50 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
32c60 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
32c70 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
32c80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
32c90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32ca0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
32cb0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
32cc0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
32cd0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
32ce0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
32cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32d10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
32d20 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
32d30 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
32d40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
32d50 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
32d60 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
32d70 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
32d80 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
32d90 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
32da0 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
32db0 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
32dc0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
32dd0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
32de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
32df0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
32e00 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
32e10 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
32e20 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
32e30 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
32e40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
32e50 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
32e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32e70 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
32e80 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
32e90 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
32ea0 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
32eb0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
32ec0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
32ed0 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
32ee0 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
32ef0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
32f00 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
32f10 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 66          robust_f
32f20 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68 46 69  truncate(conchFi
32f30 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69 7a 65  le->h, writeSize
32f40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32f50 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c 69 74  unixWrite((sqlit
32f60 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63 68 46  e3_file *)conchF
32f70 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66 65 72  ile, writeBuffer
32f80 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30 29 3b  , writeSize, 0);
32f90 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 63  .        fsync(c
32fa0 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
32fb0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
32fc0 72 65 61 74 65 64 20 61 20 6e 65 77 20 63 6f 6e  reated a new con
32fd0 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a 75 73  ch file (not jus
32fe0 74 20 75 70 64 61 74 65 64 20 74 68 65 20 63 6f  t updated the co
32ff0 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20 20 20  ntents of a .   
33000 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64 20 63        ** valid c
33010 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72 79 20  onch file), try 
33020 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70 65 72  to match the per
33030 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  missions of the 
33040 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
33050 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
33060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33070 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68 20 29  && createConch )
33080 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
33090 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
330a0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d         int err =
330b0 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
330c0 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20 20  h, &buf);.      
330d0 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
330e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f  {.            mo
330f0 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62 75 66  de_t cmode = buf
33100 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52 55 53  .st_mode&(S_IRUS
33110 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f 49 52  R|S_IWUSR | S_IR
33120 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a 20 20  GRP|S_IWGRP |.  
33130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33150 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c 53 5f        S_IROTH|S_
33160 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20 20 20  IWOTH);.        
33170 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20 6d 61      /* try to ma
33180 74 63 68 20 74 68 65 20 64 61 74 61 62 61 73 65  tch the database
33190 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d 69 73   file R/W permis
331a0 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20 66 61  sions, ignore fa
331b0 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64 65 66  ilure */.#ifndef
331c0 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
331d0 42 55 47 0a 20 20 20 20 20 20 20 20 20 20 20 20  BUG.            
331e0 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69  osFchmod(conchFi
331f0 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 23  le->h, cmode);.#
33200 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
33210 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
33220 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d 6f 64     rc = osFchmod
33230 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
33240 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
33250 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 28     }while( rc==(
33260 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  -1) && errno==EI
33270 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20 20 20  NTR );.         
33280 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
33290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
332a0 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  t code = errno;.
332b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
332c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
332d0 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20  chmod %o FAILED 
332e0 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20  with %d %s\n",. 
332f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33300 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65       cmode, code
33310 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29  , strerror(code)
33320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
33330 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
33340 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
33350 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
33360 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f   SUCCEDED\n",cmo
33370 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  de);.           
33380 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
33390 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
333a0 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
333b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  ;.            fp
333c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
333d0 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77  TAT FAILED[%d] w
333e0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20  ith %d %s\n", . 
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74     err, code, st
33410 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23  rerror(code));.#
33420 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
33430 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33440 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46    }.      conchF
33450 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
33460 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
33470 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
33480 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
33490 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b      .    end_tak
334a0 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53  econch:.      OS
334b0 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52 4f  TRACE(("TRANSPRO
334c0 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22  XY: CLOSE  %d\n"
334d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
334e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
334f0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
33500 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20  openFlags ){.   
33510 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20       int fd;.   
33520 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
33530 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
33540 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
33550 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
33560 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
33570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69     }.        pFi
33580 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  le->h = -1;.    
33590 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
335a0 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61 74  open(pCtx->dbPat
335b0 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c  h, pFile->openFl
335c0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
335d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
335e0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
335f0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
33600 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
33610 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20  RANSPROXY: OPEN 
33620 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20   %d\n", fd));.  
33630 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20        if( fd>=0 
33640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69  ){.          pFi
33650 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20  le->h = fd;.    
33660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33670 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43       rc=SQLITE_C
33680 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a  ANTOPEN_BKPT; /*
33690 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72   SQLITE_BUSY? pr
336a0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c  oxyTakeConch cal
336b0 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 64  led.           d
336c0 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f  uring locking */
336d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
336e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
336f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
33700 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29  Ctx->lockProxy )
33710 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
33720 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50  path = tempLockP
33730 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61  ath ? tempLockPa
33740 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th : pCtx->lockP
33750 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
33760 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61    rc = proxyCrea
33770 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c  teUnixFile(path,
33780 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   &pCtx->lockProx
33790 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  y, 1);.        i
337a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
337b0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
337c0 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f  OMEM && tryOldLo
337d0 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  ckPath ){.      
337e0 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e      /* we couldn
337f0 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70 72  't create the pr
33800 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69  oxy lock file wi
33810 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20  th the old lock 
33820 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20  file path.      
33830 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61       ** so try a
33840 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61  gain via auto-na
33850 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20  ming .          
33860 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
33870 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d  rceNewLockPath =
33880 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72   1;.          tr
33890 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
338a0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
338b0 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b  inue; /* go back
338c0 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68   to the do {} wh
338d0 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c  ile start point,
338e0 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20   try again */.  
338f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33900 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33920 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
33930 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74  ke a copy of pat
33940 68 20 69 66 20 77 65 20 65 78 74 72 61 63 74 65  h if we extracte
33950 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  d the value.    
33960 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
33970 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74   conch file or t
33980 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f  he path was allo
33990 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61  cated on the sta
339a0 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck.         */. 
339b0 20 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c         if( tempL
339c0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
339d0 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50       pCtx->lockP
339e0 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74  roxyPath = sqlit
339f0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74 65  e3DbStrDup(0, te
33a00 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20  mpLockPath);.   
33a10 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78         if( !pCtx
33a20 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
33a30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
33a40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
33a50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33a70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33a90 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65     pCtx->conchHe
33aa0 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
33ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74  .        if( pCt
33ac0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d  x->lockProxy->pM
33ad0 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d  ethod == &afpIoM
33ae0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
33af0 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
33b00 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a 20  ntext *afpCtx;. 
33b10 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78 20           afpCtx 
33b20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
33b30 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f 63  text *)pCtx->loc
33b40 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67 43  kProxy->lockingC
33b50 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
33b60 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74 68    afpCtx->dbPath
33b70 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
33b80 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
33b90 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  }.      } else {
33ba0 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46 69  .        conchFi
33bb0 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
33bc0 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
33bd0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e  le*)conchFile, N
33be0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
33bf0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
33c00 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 25  "TAKECONCH  %d %
33c10 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  s\n", conchFile-
33c20 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
33c30 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
33c40 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29 29  ?"ok":"failed"))
33c50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
33c60 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  c;.    } while (
33c70 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77  1); /* in case w
33c80 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79 20  e need to retry 
33c90 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b 20  the :auto: lock 
33ca0 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20 20  file - .        
33cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 73           ** we s
33cc0 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74 20  hould never get 
33cd0 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61 20  here except via 
33ce0 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20 63  the 'continue' c
33cf0 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f  all. */.  }.}../
33d00 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68 6f  *.** If pFile ho
33d10 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  lds a lock on a 
33d20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65 6e  conch file, then
33d30 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c 6f   release that lo
33d40 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
33d50 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f  t proxyReleaseCo
33d60 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
33d70 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ile){.  int rc =
33d80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
33d90 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
33da0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
33db0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
33dc0 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 2f  ontext *pCtx;  /
33dd0 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  * The locking co
33de0 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70 72  ntext for the pr
33df0 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  oxy lock */.  un
33e00 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
33e10 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
33e20 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
33e30 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d  ile */..  pCtx =
33e40 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
33e50 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
33e60 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
33e70 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74   conchFile = pCt
33e80 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
33e90 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41 53  OSTRACE(("RELEAS
33ea0 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
33eb0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
33ec0 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
33ed0 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63        (pCtx->loc
33ee0 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74  kProxyPath ? pCt
33ef0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
33f00 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20   : ":auto:"), . 
33f10 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64            getpid
33f20 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  ()));.  if( pCtx
33f30 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
33f40 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
33f50 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
33f60 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
33f70 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
33f80 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  NO_LOCK);.  }.  
33f90 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
33fa0 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  = 0;.  OSTRACE((
33fb0 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25  "RELEASECONCH  %
33fc0 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
33fd0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
33fe0 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b    (rc==SQLITE_OK
33ff0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
34000 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d")));.  return 
34010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
34020 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
34030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
34040 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d 65  compute the name
34050 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66 69   of its conch fi
34060 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  le..** Store the
34070 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20   conch filename 
34080 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
34090 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
340a0 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61 6b  malloc()..** Mak
340b0 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70 6f  e *pConchPath po
340c0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6e  int to the new n
340d0 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ame.  Return SQL
340e0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
340f0 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  s.** or SQLITE_N
34100 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20 74  OMEM if unable t
34110 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79 2e  o obtain memory.
34120 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
34130 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
34140 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
34150 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  at the allocated
34160 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
34170 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
34180 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f  reed..**.** *pCo
34190 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20 74  nchPath is set t
341a0 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d 6f  o NULL if a memo
341b0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
341c0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
341d0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
341e0 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61  reateConchPathna
341f0 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68 2c  me(char *dbPath,
34200 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50 61   char **pConchPa
34210 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  th){.  int i;   
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
34240 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  nter */.  int le
34250 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
34260 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e 67  dbPath); /* Leng
34270 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  th of database f
34280 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74 68  ilename - dbPath
34290 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
342a0 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  hPath;          
342b0 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69 6e      /* buffer in
342c0 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
342d0 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20 2a  uct conch name *
342e0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
342f0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 63   space for the c
34300 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 6e  onch filename an
34310 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
34320 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74 68   name to.  ** th
34330 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 72  e name of the or
34340 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
34350 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70 43  file. */  .  *pC
34360 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63 68  onchPath = conch
34370 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 73  Path = (char *)s
34380 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c 65  qlite3_malloc(le
34390 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63 6f  n + 8);.  if( co
343a0 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  nchPath==0 ){.  
343b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
343c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
343d0 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20 64  cpy(conchPath, d
343e0 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  bPath, len+1);. 
343f0 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65 72   .  /* now inser
34400 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20 74  t a "." before t
34410 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61 63  he last / charac
34420 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69 3d  ter */.  for( i=
34430 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20 69  (len-1); i>=0; i
34440 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  -- ){.    if( co
34450 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27 20  nchPath[i]=='/' 
34460 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  ){.      i++;.  
34470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
34480 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74 68  .  }.  conchPath
34490 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c 65  [i]='.';.  while
344a0 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20 20   ( i<len ){.    
344b0 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d 64  conchPath[i+1]=d
344c0 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69 2b  bPath[i];.    i+
344d0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70 70  +;.  }..  /* app
344e0 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68 22  end the "-conch"
344f0 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20 66   suffix to the f
34500 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ile */.  memcpy(
34510 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 2c  &conchPath[i+1],
34520 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a 20   "-conch", 7);. 
34530 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73 74   assert( (int)st
34540 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29 20  rlen(conchPath) 
34550 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20 72  == len+7 );..  r
34560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34570 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61 20  .}.../* Takes a 
34580 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  fully configured
34590 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d 73   proxy locking-s
345a0 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20 61  tyle unix file a
345b0 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20 74  nd switches.** t
345c0 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  he local lock fi
345d0 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61 74  le path .*/.stat
345e0 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f 63  ic int switchLoc
345f0 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78 46  kProxyPath(unixF
34600 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73  ile *pFile, cons
34610 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
34620 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
34630 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
34640 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34650 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
34660 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68 61  ngContext;.  cha
34670 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43 74  r *oldPath = pCt
34680 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
34690 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
346a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
346b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
346c0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
346d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
346e0 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  SY;.  }  ..  /* 
346f0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66  nothing to do if
34700 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55 4c   the path is NUL
34710 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61 74  L, :auto: or mat
34720 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69 6e  ches the existin
34730 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28 20  g path */.  if( 
34740 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d  !path || path[0]
34750 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d  =='\0' || !strcm
34760 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  p(path, ":auto:"
34770 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61 74  ) ||.    (oldPat
34780 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f 6c  h && !strncmp(ol
34790 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41 58  dPath, path, MAX
347a0 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20 20  PATHLEN)) ){.   
347b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
347c0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
347d0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
347e0 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  oxy = pCtx->lock
347f0 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78 2d  Proxy;.    pCtx-
34800 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c 3b  >lockProxy=NULL;
34810 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68  .    pCtx->conch
34820 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Held = 0;.    if
34830 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55 4c  ( lockProxy!=NUL
34840 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 6f  L ){.      rc=lo
34850 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
34860 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
34870 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72 6f  3_file *)lockPro
34880 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xy);.      if( r
34890 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
348a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
348b0 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20  e(lockProxy);.  
348c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
348d0 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a 20  free(oldPath);. 
348e0 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
348f0 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
34900 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74 68  DbStrDup(0, path
34910 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
34920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
34930 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65 20  pFile is a file 
34940 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
34950 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ened by a prior 
34960 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62 50  xOpen call.  dbP
34970 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  ath.** is a stri
34980 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65 61  ng buffer at lea
34990 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31 20  st MAXPATHLEN+1 
349a0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73 69  characters in si
349b0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
349c0 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65 20  outine find the 
349d0 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69 61  filename associa
349e0 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20 61  ted with pFile a
349f0 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a 20  nd writes it.** 
34a00 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a 73  int dbPath..*/.s
34a10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
34a20 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
34a30 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
34a40 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
34a50 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  h){.#if defined(
34a60 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66 28  __APPLE__).  if(
34a70 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
34a80 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
34a90 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20 73   ){.    /* afp s
34aa0 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65 66  tyle keeps a ref
34ab0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64 62  erence to the db
34ac0 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69 6c   path in the fil
34ad0 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20 20  ePath field .   
34ae0 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75 63   ** of the struc
34af0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
34b00 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 68   (int)strlen((ch
34b10 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
34b20 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
34b30 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
34b40 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 28  rlcpy(dbPath, ((
34b50 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
34b60 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
34b70 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50 61  ngContext)->dbPa
34b80 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
34b90 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  .  } else.#endif
34ba0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
34bb0 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f 63  ethod == &dotloc
34bc0 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
34bd0 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73 74    /* dot lock st
34be0 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f 63  yle uses the loc
34bf0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
34c00 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c 6f  store the dot lo
34c10 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 70  ck.    ** file p
34c20 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ath */.    int l
34c30 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  en = strlen((cha
34c40 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
34c50 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74 72  ngContext) - str
34c60 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  len(DOTLOCK_SUFF
34c70 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  IX);.    memcpy(
34c80 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29  dbPath, (char *)
34c90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
34ca0 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29 3b  ntext, len + 1);
34cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34cc0 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c 65   all other style
34cd0 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69 6e  s use the lockin
34ce0 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f  g context to sto
34cf0 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 70  re the db file p
34d00 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ath */.    asser
34d10 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a  t( strlen((char*
34d20 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
34d30 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54 48  ontext)<=MAXPATH
34d40 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c 63  LEN );.    strlc
34d50 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
34d60 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34d70 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41 54  gContext, MAXPAT
34d80 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  HLEN);.  }.  ret
34d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34da0 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61 6e  ../*.** Takes an
34db0 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64 20   already filled 
34dc0 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e 64  in unix file and
34dd0 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61 6c   alters it so al
34de0 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 0a  l file locking .
34df0 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66 6f  ** will be perfo
34e00 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63 61  rmed on the loca
34e10 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  l proxy lock fil
34e20 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
34e30 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65 20  g fields.** are 
34e40 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65  preserved in the
34e50 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
34e60 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
34e70 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  n be restored an
34e80 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 73  d .** the unix s
34e90 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72 6c  tructure properl
34ea0 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74 20  y cleaned up at 
34eb0 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20 20  close time:.**  
34ec0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34ed0 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a 2a  .**  ->pMethod.*
34ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34ef0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
34f00 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
34f10 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ile, const char 
34f20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78 79  *path) {.  proxy
34f30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
34f40 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62 50  pCtx;.  char dbP
34f50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ath[MAXPATHLEN+1
34f60 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ];       /* Name
34f70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34f80 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
34f90 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b 0a  *lockPath=NULL;.
34fa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34fb0 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70  E_OK;.  .  if( p
34fc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
34fd0 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
34fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
34ff0 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79 47  SY;.  }.  proxyG
35000 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
35010 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61 74  ile(pFile, dbPat
35020 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68 20  h);.  if( !path 
35030 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
35040 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
35050 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a 20  , ":auto:") ){. 
35060 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c     lockPath=NULL
35070 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
35080 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a 29  ockPath=(char *)
35090 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20 4f  path;.  }.  .  O
350a0 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50 52  STRACE(("TRANSPR
350b0 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20 70  OXY  %d for %s p
350c0 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
350d0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  >h,.           (
350e0 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b 50  lockPath ? lockP
350f0 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
35100 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
35110 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
35120 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
35130 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Ctx) );.  if( pC
35140 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  tx==0 ){.    ret
35150 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35160 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
35170 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Ctx, 0, sizeof(*
35180 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d 20  pCtx));..  rc = 
35190 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68  proxyCreateConch
351a0 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68 2c  Pathname(dbPath,
351b0 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
351c0 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63  ePath);.  if( rc
351d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
351e0 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
351f0 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74 78  ateUnixFile(pCtx
35200 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 2c  ->conchFilePath,
35210 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c   &pCtx->conchFil
35220 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
35230 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
35240 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 6f  EN && ((pFile->o
35250 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29  penFlags&O_RDWR)
35260 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20 20   == 0) ){.      
35270 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f 70  /* if (a) the op
35280 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f 74  en flags are not
35290 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68 65   O_RDWR, (b) the
352a0 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68 65   conch isn't the
352b0 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  re, and.      **
352c0 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73 79   (c) the file sy
352d0 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e 6c  stem is read-onl
352e0 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20 6e  y, then enable n
352f0 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73 73  o-locking access
35300 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c 20  ..      ** Ugh, 
35310 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d 3d  since O_RDONLY==
35320 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20 66  0x0000 we test f
35330 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63 65  or !O_RDWR since
35340 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72 74   unixOpen assert
35350 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
35360 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20 68  openFlags will h
35370 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20  ave only one of 
35380 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52 44  O_RDONLY or O_RD
35390 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  WR..      */.   
353a0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73     struct statfs
353b0 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73   fsInfo;.      s
353c0 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63 68  truct stat conch
353d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
353e0 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b 0a  goLockless = 0;.
353f0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 53 74 61  .      if( osSta
35400 74 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  t(pCtx->conchFil
35410 65 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66  ePath, &conchInf
35420 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
35430 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65       int err = e
35440 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66  rrno;.        if
35450 28 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20  ( (err==ENOENT) 
35460 26 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74  && (statfs(dbPat
35470 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
35480 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
35490 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73  goLockless = (fs
354a0 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
354b0 5f 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f  _RDONLY) == MNT_
354c0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  RDONLY;.        
354d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
354e0 69 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29  if( goLockless )
354f0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
35500 63 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20  conchHeld = -1; 
35510 2f 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f  /* read only FS/
35520 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
35530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
35540 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
35550 20 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72   }.  }  .  if( r
35560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
35570 6c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  lockPath ){.    
35580 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35590 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
355a0 74 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74  trDup(0, lockPat
355b0 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  h);.  }..  if( r
355c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
355d0 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
355e0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
355f0 75 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20  up(0, dbPath);. 
35600 20 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50     if( pCtx->dbP
35610 61 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath==NULL ){.   
35620 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
35630 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
35640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35650 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c  _OK ){.    /* al
35660 6c 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f  l memory is allo
35670 63 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72  cated, proxys ar
35680 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73  e created and as
35690 73 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20  signed, .    ** 
356a0 73 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69  switch the locki
356b0 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70  ng context and p
356c0 4d 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75  Method then retu
356d0 72 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  rn..    */.    p
356e0 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43  Ctx->oldLockingC
356f0 6f 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e  ontext = pFile->
35700 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
35710 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
35720 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
35730 3b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64  ;.    pCtx->pOld
35740 4d 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e  Method = pFile->
35750 70 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69  pMethod;.    pFi
35760 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70  le->pMethod = &p
35770 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  roxyIoMethods;. 
35780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
35790 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20  pCtx->conchFile 
357a0 29 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  ){ .      pCtx->
357b0 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
357c0 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69  od->xClose((sqli
357d0 74 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d  te3_file *)pCtx-
357e0 3e 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  >conchFile);.   
357f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35800 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29  pCtx->conchFile)
35810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35820 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 43 74  te3DbFree(0, pCt
35830 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
35850 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ree(pCtx->conchF
35860 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20 20 73  ilePath); .    s
35870 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74 78  qlite3_free(pCtx
35880 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
35890 28 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25  (("TRANSPROXY  %
358a0 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
358b0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
358c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
358d0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
358e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
358f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
35900 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 73  outine handles s
35910 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
35920 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61 74  rol() calls that
35930 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   are specific.**
35940 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   to proxy lockin
35950 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
35960 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
35970 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
35980 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
35990 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *pArg){.  switc
359a0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
359b0 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
359c0 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
359d0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
359e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
359f0 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  )id;.      if( p
35a00 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d  File->pMethod ==
35a10 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73   &proxyIoMethods
35a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f 78   ){.        prox
35a30 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
35a40 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
35a50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
35a60 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
35a70 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  ext;.        pro
35a80 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
35a90 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
35aa0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35ab0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
35ac0 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
35ad0 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c 6f  )pArg = pCtx->lo
35ae0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
35af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35b00 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68        *(const ch
35b10 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a 61  ar **)pArg = ":a
35b20 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29 22  uto: (not held)"
35b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b40 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
35b50 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20     *(const char 
35b60 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b 0a  **)pArg = NULL;.
35b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
35b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35b90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
35ba0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
35bb0 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  OXYFILE: {.     
35bc0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
35bd0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
35be0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
35bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
35c00 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74 79    int isProxySty
35c10 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d 65  le = (pFile->pMe
35c20 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49 6f  thod == &proxyIo
35c30 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20 20  Methods);.      
35c40 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 7c  if( pArg==NULL |
35c50 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  | (const char *)
35c60 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pArg==0 ){.     
35c70 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74     if( isProxySt
35c80 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  yle ){.         
35c90 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72 6f   /* turn off pro
35ca0 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f 74  xy locking - not
35cb0 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
35cc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35cd0 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c 49  ITE_ERROR /*SQLI
35ce0 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51 4c  TE_PROTOCOL? SQL
35cf0 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a 20  ITE_MISUSE?*/;. 
35d00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35d10 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e 20          /* turn 
35d20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  off proxy lockin
35d30 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66 20  g - already off 
35d40 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20 20  - NOOP */.      
35d50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35d60 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
35d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35d80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
35d90 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e 73  roxyPath = (cons
35da0 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a 20  t char *)pArg;. 
35db0 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72 6f         if( isPro
35dc0 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20 20  xyStyle ){.     
35dd0 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e       proxyLockin
35de0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
35df0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
35e00 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35e10 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  xt*)pFile->locki
35e20 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
35e30 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70       if( !strcmp
35e40 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22 29  (pArg, ":auto:")
35e50 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
35e60 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
35e70 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20 20  Path &&.        
35e80 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70 28         !strncmp(
35e90 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
35ea0 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  ath, proxyPath, 
35eb0 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20 20  MAXPATHLEN)).   
35ec0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
35ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35ee0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
35ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35f00 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c 6f     rc = switchLo
35f10 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69 6c  ckProxyPath(pFil
35f20 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
35f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35f50 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20 70      /* turn on p
35f60 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
35f70 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  g */.          r
35f80 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
35f90 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65  rmUnixFile(pFile
35fa0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
35fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35fd0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
35fe0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
35ff0 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68 65  rt( 0 );  /* The
36000 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74 68   call assures th
36010 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f 70  at only valid op
36020 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20 2a  codes are sent *
36030 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  /.    }.  }.  /*
36040 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 72  NOTREACHED*/.  r
36050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
36060 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 74  OR;.}../*.** Wit
36070 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69 6f  hin this divisio
36080 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67 20  n (the proxying 
36090 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
360a0 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f 63  tation) the proc
360b0 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65 20  edures.** above 
360c0 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20 61  this point are a
360d0 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20 54  ll utilities.  T
360e0 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64 20  he lock-related 
360f0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a 2a  methods of the.*
36100 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  * proxy-locking 
36110 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
36120 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77 2e  d object follow.
36130 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .*/.../*.** This
36140 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
36150 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
36160 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
36170 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
36180 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
36190 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
361a0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
361b0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
361c0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
361d0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
361e0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
361f0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
36200 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
36210 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
36220 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
36230 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
36240 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
36250 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
36260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36270 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
36280 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
36290 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
362a0 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46 69  sOut) {.  unixFi
362b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
362c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
362d0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
362e0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
362f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36300 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
36310 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36320 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
36330 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
36340 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
36350 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
36360 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
36370 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
36380 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
36390 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 65  kProxy;.      re
363a0 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65 74  turn proxy->pMet
363b0 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65 72  hod->xCheckReser
363c0 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  vedLock((sqlite3
363d0 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70 52  _file*)proxy, pR
363e0 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  esOut);.    }els
363f0 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64 20  e{ /* conchHeld 
36400 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73 20  < 0 is lockless 
36410 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75 74  */.      pResOut
36420 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  =0;.    }.  }.  
36430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36440 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
36450 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
36460 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
36470 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
36480 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
36490 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
364a0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
364b0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
364c0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
364d0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
364e0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
364f0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
36500 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
36510 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
36520 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
36530 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
36540 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
36550 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
36560 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
36570 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
36580 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
36590 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
365a0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
365b0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
365c0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
365d0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
365e0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
365f0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
36600 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
36610 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
36620 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
36630 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
36640 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
36650 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
36660 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
36670 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
36680 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
36690 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
366a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
366b0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
366c0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
366d0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
366e0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
366f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
36700 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
36710 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
36720 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
36730 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
36740 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
36750 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
36760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36770 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
36780 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
36790 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
367a0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
367b0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
367c0 6e 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b  nt rc = proxyTak
367d0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
367e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
367f0 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c  OK ){.    proxyL
36800 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36810 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36820 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36830 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36840 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78  xt;.    if( pCtx
36850 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b  ->conchHeld>0 ){
36860 0a 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20  .      unixFile 
36870 2a 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  *proxy = pCtx->l
36880 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20  ockProxy;.      
36890 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74  rc = proxy->pMet
368a0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
368b0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
368c0 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
368d0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
368e0 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
368f0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
36900 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
36910 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
36920 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
36930 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
36950 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
36960 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
36970 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
36980 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
36990 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
369a0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
369b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
369c0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
369d0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
369e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
369f0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
36a00 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
36a10 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
36a20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
36a30 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
36a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
36a50 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
36a60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
36a70 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
36a80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
36a90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
36aa0 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f 78 79    int rc = proxy
36ab0 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c 65 29  TakeConch(pFile)
36ac0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
36ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 72 6f  TE_OK ){.    pro
36ae0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36af0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36b00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36b10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36b20 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  ntext;.    if( p
36b30 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
36b40 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 46 69   ){.      unixFi
36b50 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43 74 78  le *proxy = pCtx
36b60 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20  ->lockProxy;.   
36b70 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d 3e 70     rc = proxy->p
36b80 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
36b90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
36ba0 72 6f 78 79 2c 20 65 46 69 6c 65 4c 6f 63 6b 29  roxy, eFileLock)
36bb0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ;.      pFile->e
36bc0 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 72 6f 78 79  FileLock = proxy
36bd0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
36be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
36bf0 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
36c00 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
36c10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36c20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
36c30 6f 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20  ose a file that 
36c40 75 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73  uses proxy locks
36c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36c60 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74  proxyClose(sqlit
36c70 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
36c80 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
36c90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
36ca0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
36cb0 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67      proxyLocking
36cc0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20  Context *pCtx = 
36cd0 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e  (proxyLockingCon
36ce0 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
36cf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
36d00 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
36d10 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  Proxy = pCtx->lo
36d20 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69  ckProxy;.    uni
36d30 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36d40 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36d50 6c 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  le;.    int rc =
36d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
36d70 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f  .    if( lockPro
36d80 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
36d90 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
36da0 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
36db0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b  lite3_file*)lock
36dc0 50 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Proxy, NO_LOCK);
36dd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36de0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36df0 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d   rc = lockProxy-
36e00 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
36e10 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36e20 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20  lockProxy);.    
36e30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36e40 6e 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  n rc;.      sqli
36e50 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f  te3_free(lockPro
36e60 78 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  xy);.      pCtx-
36e70 3e 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a  >lockProxy = 0;.
36e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f      }.    if( co
36e90 6e 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  nchFile ){.     
36ea0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
36eb0 48 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  Held ){.        
36ec0 72 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73  rc = proxyReleas
36ed0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
36ee0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
36ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36f00 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f   }.      rc = co
36f10 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
36f20 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  ->xClose((sqlite
36f30 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
36f40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
36f50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36f60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36f70 28 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20  (conchFile);.   
36f80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
36f90 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e 6c 6f  Free(0, pCtx->lo
36fa0 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
36fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36fc0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
36fd0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
36fe0 44 62 46 72 65 65 28 30 2c 20 70 43 74 78 2d 3e  DbFree(0, pCtx->
36ff0 64 62 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20  dbPath);.    /* 
37000 72 65 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67  restore the orig
37010 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  inal locking con
37020 74 65 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64  text and pMethod
37030 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a   then close it *
37040 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  /.    pFile->loc
37050 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
37060 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
37070 6e 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65  ntext;.    pFile
37080 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78  ->pMethod = pCtx
37090 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20  ->pOldMethod;.  
370a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
370b0 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
370c0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
370d0 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d  >xClose(id);.  }
370e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
370f0 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66  _OK;.}....#endif
37100 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
37110 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
37120 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
37130 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
37140 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
37150 20 73 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64   style is intend
37160 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
37170 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  AFP filesystems.
37180 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46  .** And since AF
37190 50 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  P is only suppor
371a0 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74  ted on MacOSX, t
371b0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
371c0 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74   is also.** rest
371d0 72 69 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58  ricted to MacOSX
371e0 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ..** .**.*******
371f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
37200 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
37210 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
37220 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
37230 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
37240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37280 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
37290 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
372a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
372b0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
372c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
372d0 67 69 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20  gisters all VFS 
372e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
372f0 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70  for unix-like op
37300 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65  erating.** syste
37310 6d 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ms.  This routin
37320 65 2c 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  e, and the sqlit
37330 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74  e3_os_end() rout
37340 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ine that follows
37350 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74  ,.** should be t
37360 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73  he only routines
37370 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68   in this file th
37380 61 74 20 61 72 65 20 76 69 73 69 62 6c 65 20 66  at are visible f
37390 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c  rom other.** fil
373a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
373b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
373c0 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c   once during SQL
373d0 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
373e0 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73  on and by a.** s
373f0 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54  ingle thread.  T
37400 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
37410 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73  tion and mutex s
37420 75 62 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e  ubsystems have n
37430 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  ot.** necessaril
37440 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  y been initializ
37450 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ed when this rou
37460 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
37470 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73  and so they.** s
37480 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65  hould not be use
37490 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
374a0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
374b0 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65   .  /* .  ** The
374c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
374d0 20 64 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74   defines an init
374e0 69 61 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73  ializer for an s
374f0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
37500 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65  t..  ** The name
37510 20 6f 66 20 74 68 65 20 56 46 53 20 69 73 20 4e   of the VFS is N
37520 41 4d 45 2e 20 20 54 68 65 20 70 41 70 70 44 61  AME.  The pAppDa
37530 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ta is a pointer 
37540 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  to a pointer.  *
37550 2a 20 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72  * to the "finder
37560 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41  " function.  (pA
37570 70 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e  ppData is a poin
37580 74 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ter to a pointer
37590 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69   because.  ** si
375a0 6c 6c 79 20 43 39 30 20 72 75 6c 65 73 20 70 72  lly C90 rules pr
375b0 6f 68 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66  ohibit a void* f
375c0 72 6f 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74  rom being cast t
375d0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
375e0 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f  nter.  ** and so
375f0 20 77 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74   we have to go t
37600 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
37610 6d 65 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20  mediate pointer 
37620 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
37630 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70  s.  ** when comp
37640 69 6c 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61  iling with -peda
37650 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47  ntic-errors on G
37660 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  CC.).  **.  ** T
37670 68 65 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65  he FINDER parame
37680 74 65 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ter to this macr
37690 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
376a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
376b0 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d  the.  ** finder-
376c0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66  function.  The f
376d0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72  inder-function r
376e0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
376f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   to the.  ** sql
37700 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  ite_io_methods o
37710 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
37720 6d 65 6e 74 73 20 74 68 65 20 64 65 73 69 72 65  ments the desire
37730 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62  d locking.  ** b
37740 65 68 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74  ehaviors.  See t
37750 68 65 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76  he division abov
37760 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
37770 74 68 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20  the IOMETHODS.  
37780 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64  ** macro for add
37790 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
377a0 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63  n on finder-func
377b0 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
377c0 20 4d 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69   Most finders si
377d0 6d 70 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f  mply return a po
377e0 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
377f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
37800 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e  ods.  ** object.
37810 20 20 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c    But the "autol
37820 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61  ockIoFinder" ava
37830 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58  ilable on MacOSX
37840 20 64 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20   does a little. 
37850 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   ** more than th
37860 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20  at; it looks at 
37870 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
37880 79 70 65 20 74 68 61 74 20 68 6f 73 74 73 20 74  ype that hosts t
37890 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
378a0 65 20 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73  e file and tries
378b0 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f   to choose an lo
378c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70  cking method app
378d0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a  ropriate for.  *
378e0 2a 20 74 68 61 74 20 66 69 6c 65 73 79 73 74 65  * that filesyste
378f0 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23  m time..  */.  #
37900 64 65 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56  define UNIXVFS(V
37910 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20  FSNAME, FINDER) 
37920 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
37930 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33           \.    3
37940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37950 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
37960 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37970 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a         \.    siz
37980 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20  eof(unixFile),  
37990 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
379a0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
379b0 20 20 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50       \.    MAX_P
379c0 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
379d0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
379e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
379f0 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
37a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a10 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20  * pNext */      
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a30 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20   \.    VFSNAME, 
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a50 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  zName */        
37a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37a70 0a 20 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e  .    (void*)&FIN
37a80 44 45 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41  DER,       /* pA
37a90 70 70 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20  ppData */       
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37ab0 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20     unixOpen,    
37ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
37ad0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
37ae0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37af0 20 75 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20   unixDelete,    
37b00 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
37b10 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
37b20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37b30 6e 69 78 41 63 63 65 73 73 2c 20 20 20 20 20 20  nixAccess,      
37b40 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
37b50 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
37b60 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37b70 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  xFullPathname,  
37b80 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
37b90 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
37ba0 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44       \.    unixD
37bb0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
37bc0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20   /* xDlOpen */  
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37be0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45     \.    unixDlE
37bf0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
37c00 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20  * xDlError */   
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d   \.    unixDlSym
37c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
37c40 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20  xDlSym */       
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37c60 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65  .    unixDlClose
37c70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
37c80 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  lClose */       
37c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37ca0 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73     unixRandomnes
37cb0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
37cc0 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20  domness */      
37cd0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
37ce0 20 75 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20   unixSleep,     
37cf0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
37d00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37d10 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
37d20 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  nixCurrentTime, 
37d30 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
37d40 54 69 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Time */         
37d50 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
37d60 78 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  xGetLastError,  
37d70 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
37d80 72 6f 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ror */          
37d90 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 43       \.    unixC
37da0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
37db0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
37dc0 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20  Int64 */        
37dd0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 65 74     \.    unixSet
37de0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
37df0 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
37e00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
37e10 20 5c 0a 20 20 20 20 75 6e 69 78 47 65 74 53 79   \.    unixGetSy
37e20 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
37e30 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
37e40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  /              \
37e50 0a 20 20 20 20 75 6e 69 78 4e 65 78 74 53 79 73  .    unixNextSys
37e60 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
37e70 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
37e80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
37e90 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c   }..  /*.  ** Al
37ea0 6c 20 64 65 66 61 75 6c 74 20 56 46 53 65 73 20  l default VFSes 
37eb0 66 6f 72 20 75 6e 69 78 20 61 72 65 20 63 6f 6e  for unix are con
37ec0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 6f  tained in the fo
37ed0 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 2e 0a 20  llowing array.. 
37ee0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
37ef0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  at the sqlite3_v
37f00 66 73 2e 70 4e 65 78 74 20 66 69 65 6c 64 20 6f  fs.pNext field o
37f10 66 20 74 68 65 20 56 46 53 20 6f 62 6a 65 63 74  f the VFS object
37f20 20 69 73 20 6d 6f 64 69 66 69 65 64 0a 20 20 2a   is modified.  *
37f30 2a 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  * by the SQLite 
37f40 63 6f 72 65 20 77 68 65 6e 20 74 68 65 20 56 46  core when the VF
37f50 53 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  S is registered.
37f60 20 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69    So the followi
37f70 6e 67 0a 20 20 2a 2a 20 61 72 72 61 79 20 63 61  ng.  ** array ca
37f80 6e 6e 6f 74 20 62 65 20 63 6f 6e 73 74 2e 0a 20  nnot be const.. 
37f90 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c   */.  static sql
37fa0 69 74 65 33 5f 76 66 73 20 61 56 66 73 5b 5d 20  ite3_vfs aVfs[] 
37fb0 3d 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  = {.#if SQLITE_E
37fc0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
37fd0 59 4c 45 20 26 26 20 28 4f 53 5f 56 58 57 4f 52  YLE && (OS_VXWOR
37fe0 4b 53 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  KS || defined(__
37ff0 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 55 4e  APPLE__)).    UN
38000 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
38010 20 20 20 20 20 20 20 61 75 74 6f 6c 6f 63 6b 49         autolockI
38020 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6c 73 65  oFinder ),.#else
38030 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38040 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 70 6f  ix",          po
38050 73 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  sixIoFinder ),.#
38060 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 56 46  endif.    UNIXVF
38070 53 28 22 75 6e 69 78 2d 6e 6f 6e 65 22 2c 20 20  S("unix-none",  
38080 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65     nolockIoFinde
38090 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
380a0 28 22 75 6e 69 78 2d 64 6f 74 66 69 6c 65 22 2c  ("unix-dotfile",
380b0 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
380c0 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53  r ),.    UNIXVFS
380d0 28 22 75 6e 69 78 2d 65 78 63 6c 22 2c 20 20 20  ("unix-excl",   
380e0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
380f0 29 2c 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ),.#if OS_VXWORK
38100 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75  S.    UNIXVFS("u
38110 6e 69 78 2d 6e 61 6d 65 64 73 65 6d 22 2c 20 73  nix-namedsem", s
38120 65 6d 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65  emIoFinder ),.#e
38130 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
38140 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
38150 54 59 4c 45 0a 20 20 20 20 55 4e 49 58 56 46 53  TYLE.    UNIXVFS
38160 28 22 75 6e 69 78 2d 70 6f 73 69 78 22 2c 20 20  ("unix-posix",  
38170 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
38180 29 2c 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  ),.#if !OS_VXWOR
38190 4b 53 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  KS.    UNIXVFS("
381a0 75 6e 69 78 2d 66 6c 6f 63 6b 22 2c 20 20 20 20  unix-flock",    
381b0 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c  flockIoFinder ),
381c0 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
381d0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
381e0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
381f0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
38200 45 5f 5f 29 0a 20 20 20 20 55 4e 49 58 56 46 53  E__).    UNIXVFS
38210 28 22 75 6e 69 78 2d 61 66 70 22 2c 20 20 20 20  ("unix-afp",    
38220 20 20 61 66 70 49 6f 46 69 6e 64 65 72 20 29 2c    afpIoFinder ),
38230 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
38240 69 78 2d 6e 66 73 22 2c 20 20 20 20 20 20 6e 66  ix-nfs",      nf
38250 73 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20  sIoFinder ),.   
38260 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70   UNIXVFS("unix-p
38270 72 6f 78 79 22 2c 20 20 20 20 70 72 6f 78 79 49  roxy",    proxyI
38280 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69  oFinder ),.#endi
38290 66 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  f.  };.  unsigne
382a0 64 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20  d int i;        
382b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
382c0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c  r */..  /* Doubl
382d0 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
382e0 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
382f0 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
38300 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
38310 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
38320 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
38330 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
38340 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
38350 79 73 63 61 6c 6c 29 3d 3d 31 38 20 29 3b 0a 0a  yscall)==18 );..
38360 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
38370 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20  l VFSes defined 
38380 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72  in the aVfs[] ar
38390 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ray */.  for(i=0
383a0 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73  ; i<(sizeof(aVfs
383b0 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  )/sizeof(sqlite3
383c0 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20  _vfs)); i++){.  
383d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
383e0 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c  gister(&aVfs[i],
383f0 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65   i==0);.  }.  re
38400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
38410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
38420 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  wn the operating
38430 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
38440 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70  e..**.** Some op
38450 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
38460 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f  might need to do
38470 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e   some cleanup in
38480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a   this routine,.*
38490 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e  * to release dyn
384a0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
384b0 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74  ed objects.  But
384c0 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a   not on unix..**
384d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
384e0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69   a no-op for uni
384f0 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
38500 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
38510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
38520 5f 4f 4b 3b 20 0a 7d 0a 20 0a